题目描述 https://www.luogu.org/problemnew/show/P2312
这个题的正解就很难想到了,因为数据太大了,不过为了得分,也只能打暴力
不过这么大的数据,应该想到的就是取模,为了找到正解,要取几个比较大的质数
如果取模得到的答案正确,那这个答案就应该对了
先看看代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int mod1=73377,mod2=10707707,mod3=73737579;//三个又大又不好想的模
int a1[105],a2[105],a3[105],c[1000001];
char s[1000001];
int main()
{ int n,m,tot=0,i,j,k;
freopen("equation.in","r",stdin);
freopen("equation.out","w",stdout);
cin>>n>>m;
for(i=0;i<=n;i++)
{
scanf("%s",s);//数比较大,所以要用到字符串
int l=strlen(s);
long long tmp=0;
bool b=false;
if(s[0]=='-') { b=true; s[0]='0'; }
for(j=0;j<l;j++) tmp=(tmp*10+s[j]-'0')%mod1; //取模
a1[i]=tmp; tmp=0;
for(j=0;j<l;j++) tmp=(tmp*10+s[j]-'0')%mod2; //取模
a2[i]=tmp; tmp=0;
for(j=0;j<l;j++) tmp=(tmp*10+s[j]-'0')%mod3; //还是取模
a3[i]=tmp;
if(b) { a1[i]=-a1[i]; a2[i]=-a2[i]; a3[i]=-a3[i];}//负数的更改
}
for(i=1;i<mod1;i++)
{
long long tmp=0;
for(j=n;j>=0;j--) tmp=(tmp*i+a1[j])%mod1;
if(tmp==0)//判断
for(j=i;j<=m;j+=mod1)
{
for(k=n;k>=0;k--) tmp=(tmp*j+a2[k])%mod2;
if(tmp==0)//判断
{
for(k=n;k>=0;k--) tmp=(tmp*j+a3[k])%mod3;
if(tmp==0) c[++tot]=j;//还是判断,然后记录答案
}
tmp=0;
}
}
for(i=mod1;i<=m;i+=mod1)//防止超时,还要再分段找答案
{
long long tmp=0;
for(k=n;k>=0;k--) tmp=(tmp*i+a2[k])%mod2;
if(tmp==0)
{
for(k=n;k>=0;k--) tmp=(tmp*i+a3[k])%mod3;
if(tmp==0) c[++tot]=i;
}
}
sort(c+1,c+tot+1);
cout<<tot;
for(i=1;i<=tot;i++) cout<<endl<<c[i];
fclose(stdin);fclose(stdout);
return 0;
}
没什么了 就这些