洛谷 P2312 解方程

来源:互联网 发布:微软软件正版化 编辑:程序博客网 时间:2024/05/19 06:36

题目描述
已知多项式方程:
a0+a1x+a2x^2+..+anx^n=0
求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)


【题目分析】
枚举几个质数取模暴力。


【代码】

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;int n,m,len,ans=0;int pri[]={0,22877,21893,14843};int a[4][101];int can[4][25001];char s[10001];int main(){    scanf("%d%d",&n,&m);    for (int i=0;i<=n;++i)    {        int flag=0;        scanf("%s",s);        len=strlen(s);        if (s[0]=='-') flag=1,s[0]='0';        for (int j=0;j<len;++j)            for (int k=1;k<=3;++k)            {                a[k][i]*=10;                a[k][i]+=s[j]-'0';                a[k][i]%=pri[k];            }        if (flag) for (int j=1;j<=3;++j) a[j][i]*=-1;    }    for (int i=1;i<=3;++i)    {        for (int j=0;j<pri[i];++j)        {            int tmp=a[i][n];            for (int k=n-1;k>=0;--k)            {                tmp*=j;                tmp+=a[i][k];                tmp%=pri[i];            }            if (tmp==0) can[i][j]=1;        }    }    for (int i=1;i<=m;++i)    {        int flag=1;        for (int j=1;j<=3;++j)            if (!can[j][i%pri[j]]) flag=0;        if (flag) ans++;    }    printf("%d\n",ans);    for (int i=1;i<=m;++i)    {        int flag=1;        for (int j=1;j<=3;++j)            if (!can[j][i%pri[j]]) flag=0;        if (flag) printf("%d\n",i);    }}
0 0