题目描述
已知多项式方程:
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
解题思路:
1,优化输入;
2,枚举答案;
3,用秦九韶算法判断答案是否成立。
由于这题ai的数据很大我们可以通过取模运算将大数化小来求,但这有很大风险,所以可以通过模多个数来最终结果(选的模数很关键,有时候就算你模了很多也还是有几率出错,这就要看运气了,尽量选些不常见的质数来模)
#include<stdio.h>
const int mod = 1e9+7;
long long int a[105],num[1000005];
long long int read(); //优化输入因为ai的数据过大,无法一次性读入
int main()
{
int n,m;
int i,j,sum,ans = 0;
scanf("%d%d",&n,&m);
getchar();
for(i = 0 ; i <= n ; i++)
a[i] = read();
for(i = 1 ; i <= m ; i++)
{
sum = 0;
for(j = n ; j >= 1 ; j--) //秦九韶算法
sum = (sum+a[j])*i%mod;
sum = (sum + a[0]) % mod;
if(sum == 0)
{
num[ans++] = i;
}
}
printf("%d\n",ans);
for(i = 0 ; i < ans ; i++)
printf("%lld\n",num[i]);
return 0;
}
long long int read()
{
long long int flag = 1 ,sum = 0;
char ch;
ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') flag = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
sum *= 10;
sum += ch-'0';
sum %= mod;
ch = getchar();
}
return sum*flag;
}