Evanyou Blog 彩带

洛谷P2312解方程

传送门

思路分析

怎么求解呢?

其实我们可以把左边的式子当成一个算式来计算,从1到 $ m $ 枚举,只要结果是0,那么当前枚举到的值就是这个等式的解了。可以通过编写一个 $ bool $ 函数来判断算式的值是不是0

至于如何计算这个多项式,用秦九韶算法就可以解决

细节提示 :

1.防爆 $ int $ 常用方法:模大质数!(另:好像模一个质数有的时候会出事233可以多模几个大质数

2.最好用上读入优化,而且边读边取模。

3 . $ sum $ 每次都要清零

#include <iostream> 
#include <cstdio>
#include <cstring>
#include <algorithm>
#define re register
using namespace std;
const long long mod = 1000000007;

inline int read(){
	char ch = getchar();
	long long f = 1 , x = 0 ;
	while(ch > '9' || ch < '0') {if(ch == '-') f = -1;ch = getchar();}
	while(ch >= '0' && ch <= '9'){x = ((x << 1) + (x << 3) + ch - '0') % mod ;ch = getchar();}
	return x * f;
}

long long n,m,ans,cnt,sum;
bool flag = true;//用来判断是否有解 
long long a[110],key[1000005];

inline bool calc(long long x) {
	sum = 0 ;
	for(re long long i = n ; i >= 1 ; --i) {
		sum = ((a[i] + sum) * x) % mod;
	}
	sum = (sum + a[0]) % mod;
	return !sum;
}

int main(){
	n = read();  m = read();
	for(re long long i = 0 ; i <= n ; ++i) {
		a[i] = read();
	}
	for(re long long i = 1 ; i <= m ; ++i) {
		if(calc(i)){
			flag = false;
			ans++;
			key[++cnt] = i ;
		}
	}
	if(flag) {
		printf("%lld\n",ans);
		return 0;
	}
	printf("%lld\n",ans);
	for(re long long i = 1 ; i <= cnt ; ++i)
		printf("%lld\n" , key[i]);
	return 0;
}
posted @ 2018-11-08 18:16  Stephen_F  阅读(107)  评论(0编辑  收藏  举报