NOIP 2014 D2 T3 解方程

NOIP 2014 D2 T3 解方程

​ 大整数解方程,我们可以运用 hash 思想,给大数取模进行计算。

​ 取模之后问题就很简单了,把公式化简一下:

\[a_0+a_1\times x+a_2\times x^2+\dots+a_n\times x^n=(((((a_n)\times x)+a_n-1)\times x)\dots)+a_0 \]

​ 接下来枚举答案就行,总时间复杂度是 \(O(n\times m)\) 的。

注意,此题卡自然溢出,模数请用 \(10^9+7\)

​ 代码如下:

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int MAXN = 1e4+5;
const ll MOD = 1e9+7;
int n,m,ans[MAXN];
ll a[MAXN];
char s[MAXN];
bool le;
int main()
{
//	freopen("equation.in","r",stdin);
//	freopen("equation.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=0;i<=n;++i)
	{
		scanf("%s",s+1);
		int len=strlen(s+1),f=1,st=1,cnt=0;
		if(s[1]=='-') f=-1,st=2;
		for(int j=st;j<=len;++j)
			a[i]=(a[i]*10+1ll*(s[j]-'0')*f+MOD)%MOD;
	}
	for(int i=1;i<=m;++i)
	{
		ull res=0;
		for(int j=n;j>=0;--j)
			res=(res*(ll)(i)+a[j]+MOD)%MOD;
		if(res==0) ans[++ans[0]]=i;
	}
	printf("%d\n",ans[0]);
	for(int i=1;i<=ans[0];++i) printf("%d\n",ans[i]);
	return 0;
}
posted @ 2021-09-14 10:40  夜空之星  阅读(51)  评论(0编辑  收藏  举报