noip2014T3
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip2014T3相关的知识,希望对你有一定的参考价值。
上文有提到noip2014还有没A的嘛。。就先把这个坑给填了
flappy bird好sad啊 还是先做解方程
八中的数据好强了,然而我最后凑了四个质数就A了,感谢shy!
作为联赛最后一题,学习它的思考方式比较关键.
前30分,人人都能得吧,不多说.
我一开始做,居然没有看到高精度,搞什么啊...看到1010000居然没有自动次方,晕.
看到了超长的a[i]后,可能很多人都会跟我一样,啊啊啊高精度,啊啊啊不想写,然后就能自然地诞生出取模的想法啦!
而且,五次方以上的方程没有求根公式,要么枚举要么hash!
当f(x)==0,f(x)%p==0.再进一步考虑,f(x+p)%p==f(x)%p,Po姐的blog没有写为啥,相信这个连我都能懂,所有人都可以自己脑补了.
对于每个ans,将它mod p,预处理出对于每一个质数,x取0~p-1时f(x)是否为0.
接下来是考虑冲突的问题,每一篇题解上都说冲突概率很小...个人觉得..如果出题人要卡你的话,3w以内的质数是全都可以被卡掉的吧..
不过思考也不成熟,哈希嘛尽管用就行了.
#include<cstdio> #include<cstdio> #define ll long long using namespace std; const ll pri[]={19997,11261,20023,19997,21893}; ll n,m,tot=0;ll f[25000][5];ll b[1000000]; ll a[110][5]; inline void input(int x) { char s[10100];bool flag=false;scanf("%s",s+1); for(int i=1;s[i];i++) { if(s[i]==‘-‘)flag=true; else for(int j=0;j<=4;j++)a[x][j]=(a[x][j]*10+s[i]-‘0‘)%pri[j]; } if(flag)for(int j=0;j<5;j++)a[x][j]=pri[j]-a[x][j]; } inline ll F(int x,int j) { ll re=0; for(int i=n;i>=0;i--) re=(re*x+a[i][j])%pri[j];return re; } int main() { //freopen("my.out","w",stdout); scanf("%lld%lld",&n,&m); for(int i=0;i<=n;i++)input(i); for(int j=0;j<=4;j++)for(int i=0;i<pri[j];i++) f[i][j]=F(i,j); for(int ans=1;ans<=m;ans++) { int s=0; for(int i=0;i<=4;i++) { int p=pri[i],x=ans%p; if(f[x][i]==0)s++; } if(s==5)++tot,b[tot]=ans; } printf("%lld\\n",tot); for(int i=1;i<=tot;i++)printf("%lld\\n",b[i]); }
以上是关于noip2014T3的主要内容,如果未能解决你的问题,请参考以下文章