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 ] 内的一个整数解。

样例输入[复制]
输入样例#1:
2 10 
1
-2
1

输入样例#2:
2 10
2
-3
1

输入样例#3:
2 10 




样例输出[复制]
输出样例#1:
1
1
输出样例#2:
2
1
2
输出样例#3:
0
提示

对于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

猜你喜欢

转载自www.cnblogs.com/saionjisekai/p/9847641.html