intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) cin >> p[i]; int res = 0; for (int i = 0; i < 1 << m; i++) { int sgn = 1; longlong factor = 1; for (int j = 0; j < m; j++) { if (i >> j & 1) { factor *= p[j]; if (factor > n) break; sgn = -sgn; } } res += n / factor * sgn; } printf("%d\n", n - res); return0; }
Devu 和花
Devu 有 N 个盒子,第 i 个盒子中有 Ai 枝花。同一个盒子内的花颜色相同,不同盒子内的花颜色不同。
Devu 要从这些盒子中选出 M 枝花组成一束,求共有多少种方案。若两束花每种颜色的花的数量都相同,则认为这两束花是相同的方案。求方案数对 1e9+7 取模后输出。
typedeflonglong LL; constint N = 25, mod = 1e9+7; int n, b; LL m, down, q[N];
intqmi(int a, int k){ int res = 1; while (k) { if (k & 1) res = (LL)res * a % mod; a = (LL)a * a % mod; k >>= 1; } return res; }
LL C(LL a){ if (a < b) return0; LL up = 1; // 大数先模后乘 否则溢出 for (LL i = a; i >= a-b+1; i--) { up = i % mod * up % mod; } return up * down % mod; }
intmain(){ cin >> n >> m; // 预处理出组合数的 b 和分母中的 b!^{-1} b = n-1; down = 1; for (int i = 2; i <= b; i++) down = down * i % mod; down = qmi(down, mod-2); for (int i = 0; i < n; i++) cin >> q[i]; LL res = 0; // C(m+n-1, n-1) 也合并到同一个循环中, 当状态全为 0 的时候 for (int i = 0; i < 1 << n; i++) { LL a = m + n - 1; int sgn = 1; for (int j = 0; j < n; j++) { if (i >> j & 1) { sgn *= -1; a -= q[j] + 1; } } res = (res + C(a) * sgn) % mod; } cout << (res + mod) % mod << endl; return0; }