您的位置:首页 > 其它

【URAL】1091 Tmutarakan Exams

2012-09-06 15:17 281 查看
题意:取k个不同的数,每个数不超过s,问种数。

若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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: