[NOIP2014] 解方程

题目描述

已知多项式方程:

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

输入输出样例

输入样例#1:
2 10 
1
-2
1
输出样例#1:
1
1
输入样例#2:
2 10
2
-3
1
输出样例#2:
2
1
2
输入样例#3:
2 10 
1  
3  
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

 

题解:
具体不是很清楚啊......

抄了抄代码而已......

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <iostream>
 7 #define ll long long 
 8 using namespace std;
 9 
10 const int maxn = 110;
11 const int maxm = 1000010;
12 
13 int n,m;
14 int mod[5]={11261,19997,22877,21893,14843};
15 int a[maxn][5],ans[maxm],pre[maxn][5],res[maxm][5];
16 char s[10010];
17 
18 int cal(int x, int j) {
19   int sum=0;
20   for(int i=0; i<=n; i++) sum=(sum+pre[i][j]*a[i][j])%mod[j];
21   if(sum<0) sum+=mod[j];//处理模后负数,%+%
22   return sum;
23 }
24 
25 bool check(int x) {
26   for(int j=0; j<5; j++) 
27     if(res[x%mod[j]][j]) return 0;
28   return 1;
29 }
30 
31 int main() {
32   scanf("%d%d", &n, &m);
33   for(int i=0; i<=n; i++) {
34     scanf("%s", s);
35     int ls=strlen(s); bool flg=0;
36     for(int j=0; j<5; j++)
37       if(s[0]=='-') flg=1;
38       else a[i][j]=s[0]-'0';
39     for(int j=0; j<5; j++) {
40       for(int l=1; l<ls; l++) a[i][j]=(a[i][j]*10+s[l]-'0')%mod[j];
41       if(flg) a[i][j]=-a[i][j];
42     }
43   }
44   for(int j=0; j<5; j++) {
45     pre[0][j]=1;
46     for(int x=1; x<mod[j]; x++) {
47       for(int i=1; i<=n; i++) 
48     pre[i][j]=(pre[i-1][j]*x)%mod[j];
49       res[x][j]=cal(x,j);
50     }
51   }
52   for(int i=1; i<=m; i++)
53     if(check(i)) ans[++ans[0]]=i;
54   printf("%d\n", ans[0]);
55   for(int i=1; i<=ans[0]; i++) 
56     printf("%d\n", ans[i]);
57   return 0;
58 }

 

posted @ 2017-08-01 09:50  HLX_Y  阅读(219)  评论(0编辑  收藏  举报