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;
}
路漫漫其修远兮,吾将上下而求索。