洛谷P2312 解方程(NOIP 2014)

题目描述 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;
}

没什么了 就这些

猜你喜欢

转载自blog.csdn.net/qq_42920122/article/details/82950975