codevs 3732 解方程

神题不可言会。

f(x+p)=f(x)(mod p)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 10050
#define maxn 105
using namespace std;
int n,m,num[maxn][maxl],prime[]={0,5003,11261,19997,22877,21893},a[maxn],flag[maxn],ans[maxl*100],cnt=0;
char s[maxl];
bool vis[6][25000];
void solve(int x)
{
    for (int i=0;i<=n;i++)
    {
        int data=0;
        for (int j=1;j<=num[i][0];j++)
            data=(data*10+num[i][j])%prime[x];
        a[i]=data;
        if (flag[i]) a[i]=-a[i];
    }
    vis[x][0]=true;
    for (int i=1;i<=prime[x]-1;i++)
    {
        int data=a[n]*i%prime[x];
        for (int j=n-1;j>=0;j--)
            data=(data+a[j])*i%prime[x];
        if (data==0) vis[x][i]=true;
    }
}
int main()
{
    memset(flag,false,sizeof(flag));
    scanf("%d%d",&n,&m);
    for (int i=0;i<=n;i++)
    {
        scanf("%s",s);
        if (s[0]=='-')
        {
            flag[i]=true;
            int len=strlen(s);num[i][0]=len-1;
            for (int j=1;j<=len-1;j++)
                num[i][j]=s[j]-'0';
        }
        else
        {
            int len=strlen(s);num[i][0]=len;
            for (int j=0;j<=len-1;j++)
                num[i][j+1]=s[j]-'0';
        }
    }    
    for (int i=1;i<=5;i++)
        solve(i);
    for (int i=1;i<=m;i++)
    {
        bool now=true;
        for (int j=1;j<=5;j++)
            now&=vis[j][i%prime[j]];
        if (now) ans[++cnt]=i;
    }
    printf("%d
",cnt);
    for (int i=1;i<=cnt;i++)
        printf("%d
",ans[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5754406.html