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; }
typedeflonglong LL; constint N = 50010; int mu[N], primes[N], cnt; bool st[N];
voidinit(int n){ mu[1] = 1; for (int i = 2; i <= n; i++) { if (!st[i]) { primes[cnt++] = i; mu[i] = -1; } for (int j = 0; primes[j] <= n/i; j++) { st[i*primes[j]] = true; if (i % primes[j] == 0) { break; } mu[i*primes[j]] = -mu[i]; } } }
intmain(){ int T, a, b, d; init(N-1); scanf("%d", &T); while (T--) { scanf("%d%d%d", &a, &b, &d); a /= d, b /= d; LL res = 0; for (int i = 1; i <= a && i <= b; i++) { res += (a/i)*(b/i)*mu[i]; } printf("%lld\n", res); } return0; }
intmain(){ int T, a, b, d; init(N-1); for (int i = 1; i < N; i++) smu[i] = smu[i-1] + mu[i]; scanf("%d", &T); while (T--) { scanf("%d%d%d", &a, &b, &d); a /= d, b /= d; LL res = 0; for (int i = 1, j = -1; i <= a && i <= b; i = j+1) { j = min(a / (a / i), b / (b / i)); // 因为在 i~j 段中 (a/i)*(b/i) 结果相同 // 把这两项提出来里面只剩莫比乌斯函数的求和了 res += (LL)(a/i)*(b/i)*(smu[j]-smu[i-1]); } printf("%lld\n", res); } return0; }