[NOIP 2014]解方程 秦九韶算法+质数取模

来源:互联网 发布:三星scx3400扫描软件 编辑:程序博客网 时间:2024/06/01 13:26

代码

#include <cstdio>#include <iostream>#include <cstring>using namespace std;int n,m,len,prime[5]={10007,11261,14843,19997,21893},sum(1);long long a[105][10],f[30000][10],ans[1001001];long long Calculate(int x,int j){    long long t=0;    for(int i=n;i>=0;i--){        t=(t*x+a[i][j])%prime[j];    }    return t;}void Read(int x) {    static char s[10100];int flag=0;    scanf("%s",s);    len=strlen(s);    for(int i=0;i<len;i++){        if(s[i]=='-'){            flag=1;        }else{            for(int j=0;j<5;j++){                a[x][j]=(a[x][j]*10+s[i]-'0')%prime[j];            }                   }    }    if(flag==1){        for(int j=0;j<5;j++){            a[x][j]=prime[j]-a[x][j];        }    }}int main() {    scanf("%d%d",&n,&m);    for(int i=0;i<=n;i++) {        Read(i);    }    for(int j=0;j<5;j++){        for(int i=0;i<=prime[j];i++){            f[i][j]=Calculate(i,j);        }    }       for(int i=1;i<=m;i++){        int j=0;        for(j=0;j<5;j++){            if(f[i%prime[j]][j]){                break;            }        }        if(j==5){            ans[sum++]=i;        }    }    printf("%d\n",sum-1);    for(int i=1;i<=sum-1;i++){        printf("%lld\n",ans[i]);    }    return 0;}
0 0