【URAL】1091 Tmutarakan Exams
2012-09-06 15:17
281 查看
题意:取k个不同的数,每个数不超过s,问种数。
若kx1,kx2,...,kx3满足条件,则x1,x2,...,x3必然满足条件。
因此枚举素数容斥,2*3*5*7>50,所以枚举之多三层。
若kx1,kx2,...,kx3满足条件,则x1,x2,...,x3必然满足条件。
因此枚举素数容斥,2*3*5*7>50,所以枚举之多三层。
#include<cstdio> #include<cstring> #include<vector> #define MAXN 60 typedef long long LL; using namespace std; bool p[MAXN]; vector<int> prime; LL C[MAXN][MAXN]; void Init() { int i, j; memset(p, true, sizeof(p)); for (i = 2; i < 10; i++) { if (p[i]) { for (j = i * i; j < MAXN; j += i) p[j] = false; } } prime.clear(); for (i = 2; i < MAXN; i++) { if (p[i]) prime.push_back(i); } memset(C, 0, sizeof(C)); for (i = 0; i < MAXN; i++) C[i][0] = C[i][i] = 1; for (i = 1; i < MAXN; i++) { for (j = 1; j < i; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } int main() { LL ans; int t, s, i, j, k; Init(); while (~scanf("%d%d", &t, &s)) { for (ans = i = 0; i < (int) prime.size(); i++) ans += C[s / prime[i]][t]; for (i = 0; i < (int) prime.size(); i++) { for (j = i + 1; j < (int) prime.size(); j++) ans -= C[s / prime[i] / prime[j]][t]; } for (i = 0; i < (int) prime.size(); i++) { for (j = i + 1; j < (int) prime.size(); j++) { for (k = j + 1; k < (int) prime.size(); k++) ans += C[s / prime[i] / prime[j] / prime[k]][t]; } } if (ans > 10000) ans = 10000; printf("%lld\n", ans); } return 0; }
相关文章推荐
- Ural 1091 Tmutarakan Exams 解题报告(容斥原理)
- Ural 1091 Tmutarakan Exams [容斥原理]
- URAL 1091 Tmutarakan Exams (DP或容斥)
- URAL 1091 Tmutarakan Exams(容斥原理)
- URAL1091 Tmutarakan Exams
- URAL 1091 Tmutarakan Exams 【容斥】【组合数】
- URAL1091---Tmutarakan Exams(dp)
- Ural 1091 Tmutarakan Exams (水题 容斥+ 莫比乌斯反演)
- URAL_1091_Tmutarakan Exams
- Ural 1091 Tmutarakan Exams
- URAL 1091 Tmutarakan Exams
- Ural 1091 Tmutarakan Exams【容斥原理】
- URAL1091 Tmutarakan Exams (容斥原理)
- 【URAL】1091 Tmutarakan Exams (简单容斥原理)
- 1091. Tmutarakan Exams
- ural 1091. Tmutarakan Exams 和 codeforces 295 B. Greg and Graph
- ural 1091
- hdu 1695 GCD 容斥原理 ural 1091
- URAL 1091
- ural1091(莫比乌斯 容斥)