bzoj 3751: [NOIP2014]解方程【数学】

……我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了……
就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000005,p[]={11261,19997,22877,21893,14843};
long long n,m,a[110][10],cnt[N];
bool f[N][10];
char s[N];
bool clc(int v,int j)
{
    long long r=0;
    for(int i=n;i>=0;--i)
		r=(r*v+a[i][j])%p[j];
    return r!=0;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;++i)
    {
        scanf("%s",s);
        int len=strlen(s),fl=1;
        for(int l=0;l<len;++l)
        {
            if(s[l]=='-')
				fl=-1;
            else
				for(int j=0;j<5;++j)
					a[i][j]=(a[i][j]*10+s[l]-'0')%p[j];
        }
        if(fl==-1)
			for(int j=0;j<5;++j)
				a[i][j]=p[j]-a[i][j];
    }
    for(int j=0;j<5;++j)
		for(int i=0;i<p[j];++i)
			f[i][j]=clc(i,j);
	for(int i=1;i<=m;++i)
    {
        bool fl=1;
        for(int j=0;j<5;++j)
			if(f[i%p[j]][j])
			{
				fl=0;
				break;
			}
        if(fl)
			cnt[++cnt[0]]=i;
    }
    printf("%d\n",cnt[0]);
    for(int i=1;i<=cnt[0];++i)
		printf("%d\n",cnt[i]);
    return 0;
}
posted @ 2018-09-13 17:05  lokiii  阅读(136)  评论(0编辑  收藏  举报