• 51nod 1172 Partial Sums V2 卡精度的任意模数FFT


    卡精度的任意模数fft模板题……
    这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.
    然后我就去网上抄了一下板子……
    我打的是最土的任意模数fft,就是fft7次的那种……(好像有很多方法的样子……)
    这种任意模数fft方法见http://blog.csdn.net/l_0_forever_lf/article/details/52886397
    这道题的具体做法见http://blog.csdn.net/qq_33229466/article/details/78837522
    这种方法的思想就是:
      I.既然出题人给出了任意模数的多项式乘法,那么常规ntt肯定是不行
      II.既然他取模,那数会很大,会炸精,常规的fft也不行
      III.既然直接乘会炸精,那我们就把数变小,多跑几次也没关系
    (IV.感觉加了一维卷积,有种这种方法很妙,可以继续扩展的感觉,但是很模糊,也说不具体)
    本着这种思路,我们逆变换的时候,不能在点值表达式直接操作,最后一遍回去,因为这样效果和没有在一开始把数缩小一样,会炸精.
    最后说一下这道题的坑点:如果你不预处理复数,你会炸精.
    好像有的人没有预处理,但是用了long double,就没有被卡……
    似乎cmath库里有标准库也有类库,而且有的函数两者并不都具有,但是最坑爹的一点是对于sin,cos等函数,cmath标准库的精度大于cmath类库……(这只是我经过亲身试验做出的推测)
    反正预处理就没有这些破事……

    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <complex>
    #include <algorithm>
    typedef long long LL;
    typedef double db;
    typedef std::complex<db> cd;
    const int N=200010;
    const db Pai=acos((db)-1);
    const int P=1000000007;
    cd a1[N],b1[N],a2[N],b2[N],c1[N],c2[N],c3[N],w1[N],w2[N];
    int rev[N],len;
    int ai[N],bi[N],ans[N],ni[N];
    inline void fft(cd *C,int opt,cd *wn){
      register int i,j,k;cd temp;
      for(i=1;i<len;++i)if(rev[i]>i)std::swap(C[i],C[rev[i]]);
      for(k=2;k<=len;k<<=1){
        for(i=0;i<len;i+=k){
          for(j=0;j<(k>>1);++j){
            temp=C[i+j+(k>>1)]*wn[len/k*j];
            C[i+j+(k>>1)]=C[i+j]-temp;
            C[i+j]+=temp;
          }
        }
      }
      if(opt==-1){
        db inv=1./len;
        for(i=0;i<len;++i)C[i]*=inv;
      }
    }
    inline void Mul(int *a,int *b,int *c,int n){
      len=1;
      while(len<n)len<<=1;
      int i,sqr=sqrt(P);
      cd temp;
      for(i=1;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
      for(i=0;i<len;++i){
        w1[i]=cd(std::cos(2.*Pai/len*i),std::sin(2.*Pai/len*i));
        w2[i]=cd(std::cos(-2.*Pai/len*i),std::sin(-2.*Pai/len*i));
      }
      for(i=0;i<len;++i){
        a1[i]=ai[i]/sqr,b1[i]=ai[i]%sqr;
        a2[i]=bi[i]/sqr,b2[i]=bi[i]%sqr;
      }
      fft(a1,1,w1),fft(b1,1,w1),fft(a2,1,w1),fft(b2,1,w1);
      for(i=0;i<len;++i){
        c1[i]=a1[i]*a2[i];
        c2[i]=a1[i]*b2[i]+a2[i]*b1[i];
        c3[i]=b1[i]*b2[i];
      }
      fft(c1,-1,w2),fft(c2,-1,w2),fft(c3,-1,w2);
      for(i=0;i<len;++i)
        c[i]=((LL)(round(c1[i].real()))%P*sqr%P*sqr%P+(LL)(round(c2[i].real()))%P*sqr%P+(LL)(round(c3[i].real()))%P)%P;
    }
    int main(){
      int n,k,i;
      scanf("%d%d",&n,&k);
      for(i=0;i<n;++i)scanf("%d",&ai[i]);
      bi[0]=1;
      for(i=1;i<n;++i)
        bi[i]=(LL)bi[i-1]*(k+i-1)%P*(i==1?ni[i]=1:ni[i]=(-(LL)(P/i)*ni[P%i]%P+P)%P)%P;
      Mul(ai,bi,ans,n<<1);
      for(i=0;i<n;++i)printf("%d
    ",ans[i]);
      return 0;
    }
  • 相关阅读:
    强化学习框架RLlib教程003:Training APIs的使用(二)基础pythonAPI
    强化学习框架RLlib教程002:Training APIs(一)快速入门与配置项
    强化学习框架RLlib教程001:Ray和RLlib介绍
    强化学习原理源码解读004:A3C (Asynchronous Advantage Actor-Critic)
    强化学习原理源码解读003:Actor-Critic和A2C
    强化学习原理源码解读002:DQN
    强化学习原理源码解读001:Policy Gradient
    部署服务包卡住不打日志排查问题
    [转]Angular Reactive Forms -- Model-Driven Forms响应式表单
    AWS DMS MySql数据同步Elasticsearch
  • 原文地址:https://www.cnblogs.com/TSHugh/p/8490076.html
Copyright © 2020-2023  润新知