2014Day2T3
tyvj 4059
这题第一想法是 求根公式,结果一想,五次以上有吗,我的天啊。
然后 那就枚举吧
枚举 这么大的 数据范围咋整啊
然后 对不起大家 搜题解了。
很巧妙啊 ! 用一些素数 筛掉上面 更多的数就 ok了
嗯 素数怎么选、 越多越好吧
5个很好?
我用了3个。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define maxn 1000010
#define int long long
const int prime[] = {10007,10917,30071,6247,7993};
int n,m;
long long a[110][6];
bool f[100000][6];
int cnt[maxn];
char s[10010];
bool calc(int value, int j) {
long long tmp = 0;
for (int i = n; i>=0; --i)
tmp = (tmp * value + a[i][j]) % prime[j];
return tmp != 0;
}
signed main(){
cin>>n>>m;
for (int i = 0; i <= n; ++i) {
scanf("%s", s);
int len = strlen(s);
int sign = 1;
for (int l = 0; l < len; ++l) {
if(s[l]=='-')
sign = -1;
else
for (int j = 0; j < 5; ++j)
a[i][j]=( a[i][j] * 10 + s[l]-'0' ) % prime[j];
}
if (sign == -1)
for (int j = 0; j < 5; ++j)
a[i][j] = - a[i][j];
}
for (int j = 0; j < 5; ++j)
for(int i = 0; i < prime[j]; ++i)
f[i][j]=calc(i,j);
for (int i = 1; i <=m; ++i) {
bool flag = true;
for(int j = 0; j < 5; ++j)
if(f[i % prime[j]][j]) {
flag = false; break;
}
if(flag)
cnt[++cnt[0]] = i;
}
printf("%lld\n", cnt[0]);
for (int i = 1; i <= cnt[0]; ++i)
printf("%lld\n",cnt[i]);
return 0;
}