题目描述
已知多项式方程:
a0+a1x+a2x^2+..+anx^n=0
求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)
输入输出格式
输入格式:
输入文件名为equation .in。
输入共n + 2 行。
第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。
接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an
输出格式:
输出文件名为equation .out 。
第一行输出方程在[1, m ] 内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。
输入输出样例
说明
对于30%的数据:0<n<=2,|ai|<=100,an!=0,m<100
对于50%的数据:0<n<=100,|ai|<=10^100,an!=0,m<100
对于70%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<10000
对于100%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<1000000
暴力:30分
正解:枚举[1,m}内的数,然后用秦九昭算法计算多项式的值O(n*m)
**:因为输入数据很大,所以在边输入边取模,这是我想到的,但是却没有想到点上。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<queue> 5 #include<algorithm> 6 #include<cstring> 7 #include<string> 8 #define ll long long 9 #define mod 1000000007 10 using namespace std; 11 ll n,m,a[120]; 12 inline ll read() 13 { 14 ll x=0,w=1;char ch=getchar(); 15 while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} 16 while(isdigit(ch)) x=((x<<3)+(x<<1)+ch-‘0‘)%mod,ch=getchar(); 17 return x*w%mod; 18 } 19 ll cnt,ans[1000010]; 20 bool ok(ll x) 21 { 22 ll k=0; 23 for(ll i=n;i>=0;--i) 24 k=(k*x+a[i]%mod)%mod; 25 return (k==0); 26 } 27 int main() 28 { 29 n=read();m=read(); 30 for(ll i=0;i<=n;++i) a[i]=read(); 31 for(ll i=1;i<=m;++i) 32 if(ok(i)) ans[++cnt]=i; 33 printf("%lld\n",cnt); 34 for(ll i=1;i<=cnt;++i) 35 printf("%lld\n",ans[i]); 36 return 0; 37 }
等待思维之花的绽放。