10.24T3 解方程 取模意义下运算+秦九韶算法
#1228 解方程
描述
已知多项式方程:
a0+a1x+a2x^2+..+anx^n=0
求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)
输入
输入共n + 2 行。
第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。
接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an
输出
第一行输出方程在[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
由于在取模意义下解的结果是不会变化的,所以我们就可以随便选两个质数来保证解的唯一性
如果我们找到了一个非解,那么根据同余的性质它加上模数的倍数肯定也不是解
所以我们就可以直接做下来了
code:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const long long mod1=117431; 6 const long long mod2=102437; 7 string a[1000]; 8 long long n,m,c[1005],b[100005],vis[2000005]; 9 long long QJS(long long x,int mod) { 10 long long temp=b[1]; 11 for(long long i=1; i<=n; i++) { 12 temp=(temp*x+b[i+1])%mod; 13 } 14 // if(x==1)cout<<"temp="<<temp<<"\n"; 15 return temp; 16 } 17 long long QJS2(long long x,int mod) { 18 long long temp=c[1]; 19 for(long long i=1; i<=n; i++) { 20 temp=(temp*x+c[i+1])%mod; 21 } 22 // if(x==1)cout<<"TEMP="<<temp<<"\n"; 23 return temp; 24 } 25 long long Ans[1000005]; 26 int pre1(string k) { 27 int x=0,f=1,st=0; 28 if(k[0]=='-')f=-1,st=1; 29 for(int i=st; i<k.size(); i++) { 30 x=(x<<3)+(x<<1)+k[i]-'0'; 31 x%=mod1; 32 } 33 return x*f; 34 } 35 int pre2(string k) { 36 int x=0,f=1,st=0; 37 if(k[0]=='-')f=-1,st=1; 38 for(int i=st; i<k.size(); i++) { 39 x=(x<<3)+(x<<1)+k[i]-'0'; 40 x%=mod2; 41 } 42 return x*f; 43 } 44 int main() { 45 // freopen("equation8.in","r",stdin); 46 cin>>n>>m; 47 for(long long i=1; i<=n+1; i++) { 48 cin>>a[n+2-i]; 49 } 50 for(int i=1; i<=n+1; i++) { 51 b[i]=pre1(a[i]); 52 c[i]=pre2(a[i]); 53 } 54 long long ans=0; 55 int p[3]; 56 p[1]=mod1,p[2]=mod2; 57 for(int i=1; i<=2; i++) { 58 for(int x=0; x<p[i]; x++) { 59 if(i==1) { 60 if(QJS(x,p[i])==0) { 61 for(int j=x; j<=m; j+=p[i]) { 62 if((++vis[j])==2) { 63 Ans[++ans]=j; 64 } 65 } 66 } 67 } else { 68 if(QJS2(x,p[i])==0) { 69 for(int j=x; j<=m; j+=p[i]) { 70 if((++vis[j])==2) { 71 Ans[++ans]=j; 72 } 73 } 74 } 75 } 76 } 77 } 78 sort(Ans+1,Ans+ans+1); 79 cout<<ans<<'\n'; 80 for(long long i=1; i<=ans; i++) { 81 cout<<Ans[i]<<'\n'; 82 } 83 return 0; 84 }
over