【题目描述】
已知多项式方程:a0+a1*x+a2*x2+······+an*xn=0,求这个方程在[1,m]内的整数解(n和m均为正整数)。
【输入描述】
输入共n+2行。
第一行输入两个整数n、m;
接下来n+1行每行包含一个整数,分别表示a0、a1、a2······an。
【输出描述】
第一行输出一个数,表示方程在[1,m]内的整数解的个数;
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解。
【输入样例】
样例1:
2 10
1
-2
1
样例2:
2 10
2
-3
1
样例3:
2 10
1
3
2
【输出样例】
样例1:
1
1
样例2:
2
1
2
样例3:
0
【数据范围及提示】
对于30%的数据,0 < n <= 2,|ai| <= 100,an != 0,m < 100;
对于50%的数据,0 < n <= 100,|ai| <= 10100,an != 0,m < 100;
对于70%的数据,0 < n <= 100,|ai| <= 1010000,an != 0,m < 10000;
对于100%的数据,0 < n <= 100,|ai| <= 1010000,an != 0,m < 1000000。
源代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,num[1000001],Prime[3]={10007,10917,30071}; long long i[110][5]; bool f[100000][5]={0}; char S[10001]; bool Calc(int Value, int t) { long long Num=0; for (int a=n;a>=0;a--) Num=(Num*Value+i[a][t])%Prime[t]; return Num!=0; } int main() { scanf("%d%d",&n,&m); for (int a=0;a<=n;a++) { scanf("%s",S); int Length=strlen(S); int Sign=1; for (int L=0;L<Length;L++) { if (S[L]=='-') Sign=-1; else for (int b=0;b<3;b++) i[a][b]=(i[a][b]*10+S[L]-'0')%Prime[b]; } if (Sign==-1) for (int b=0;b<3;b++) i[a][b]=Prime[b]-i[a][b]; } for (int b=0;b<3;b++) for (int a=0;a<Prime[b];a++) f[a][b]=Calc(a,b); for (int a=1;a<=m;a++) { bool Flag(0); for (int b=0;b<3;b++) if (f[a%Prime[b]][b]) { Flag=true; break; } if (!Flag) num[++num[0]]=a; } printf("%d ",num[0]); for (int a=1;a<=num[0];a++) printf("%d ",num[a]); return 0; }