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]);
}
View Code

 

以上是关于noip2014T3的主要内容,如果未能解决你的问题,请参考以下文章

noip2016 Day1T3

试题复习

NOIP2017 Day2T3

noip2013day1t3货车运输(瓶颈路,树上倍增)

NOIP 2011 Day1T3 Mayan游戏

NOIP 2011 Day1T3 Mayan游戏