2014D2T3 解方程

2014D2T3 解方程

problem

求方程(a_0+a_1x+a_2x^2+...+a_nx^n=0)([1,m])内的整数解。

solution

秦九韶算法。大数取模。
秦九韶算法

code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
int read(){
	int a=0,op=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') op=-1;c=getchar();}
	while(c>='0'&&c<='9'){a*=10,a+=c^48,c=getchar();}
	return a*op;
}
//带取模的快读
const int maxn=1e6+5;
const int mod=1e9+7;
long long n,m,ans,cnt,sum=0;
int A[105],key[maxn];
bool t=true;//用来判断是否有解
long long fastread(){
	long long a=0,op=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') op=-1;c=getchar();}
	while(c>='0'&&c<='9'){a=(a*10+c-'0')%mod;c=getchar();}
	return a*op;
}
bool calc(long long x){
	sum=0;//!
	for(long long i=n;i>=1;i--) sum=((A[i]+sum)*x)%mod;//秦九韶算法,A[0]不需要乘x
	sum=(sum+A[0])%mod;
	return !sum;//如果答案是0说明x为多项式的解,返回1
}
int main(){
	n=fastread();m=fastread();
	//printf("%lld %lld",n,m);
	for(long long i=0;i<=n;i++) A[i]=fastread();
	for(long long i=1;i<=m;i++){
		if(calc(i)){
			//有解
			t=false;
			ans++;
			key[++cnt]=i;
		}
	}
	if(t){//ans=0
		printf("%lld",ans);
		return 0;
	}
	printf("%lld
",ans);
	for(long long i=1;i<=cnt;i++){
		printf("%d
",key[i]);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/liuziwen0224/p/2014d2t3.html