解方程

嗨呀昨天忘了更了。。

这题有毒。。不改读优过不了的。。

原题链接:https://www.luogu.org/problem/show?pid=2312#sub

思路是套秦九韶公式。其实很简单,枚举答案带入计算就好。如果发现带入这个值算出来每一项都是0那这就是一个解。

我们用ans存储解的个数,用solvenum数组记录某个具体的解。

坑点在于记得取模,计算时要取模,读入的时候也要取。。。。。。

被这里坑惨了,一直都是30分。。。

参考代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cctype>
 5 #define mo 19260817
 6 #define maxn 105
 7 #define maxm 1000005
 8 using namespace std;
 9 bool flag = true;
10 int n,m,ans,cnt;
11 int sum = 0;
12 int a[maxn];
13 int solvenum[maxm];
14 inline int read(){
15     int num = 0;
16     char c;
17     bool flag = false;
18     while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
19     if (c == '-')
20         flag = true;
21     else
22         num = c - '0';
23     while (isdigit(c = getchar()))
24         num = ( (num*10) + c - '0' ) % mo; // 有毒 。。。。。
25     return (flag ? -1 : 1) * num;
26 }
27 
28 bool qjs_calc(long long int x){
29     sum = 0;
30     for (long long int i=n;i>=0;i--)
31         sum = ((a[i] + sum) * x) % mo;
32     if (sum == 0)
33         return true;
34     else
35         return false;
36 }
37 int main(){
38     n = read();m = read();
39     for (long long int i=0;i<=n;i++)
40         a[i] = read();
41     for (long long int i=1;i<=m;i++){
42         if (qjs_calc(i)){
43             ans++;
44             solvenum[++cnt] = i;
45         }
46     }
47     printf("%d\n",ans);
48     for (long long int i=1;i<=cnt;i++){
49         printf("%d\n",solvenum[i]);
50     }
51     return 0;
52 }

 

posted @ 2017-10-19 23:43  ShawnZhou_Aether  阅读(203)  评论(0编辑  收藏  举报