zoukankan      html  css  js  c++  java
  • #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)

    Description
    给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案

    题解:

    • dp[i]表示组合成包含i个贝壳的项链的总方案数
    • 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)
    • #include <bits/stdc++.h>
      using namespace std;
      #define dob complex<double>
      #define rint register int
      #define mo 313
      #define IL inline
      const double pi=acos(-1.0);
      const int N=2e5;
      dob a[N],b[N],bb[N];
      int n,m,r[N],l,dp[N],sum[N];
      IL void fft(dob *a,int o)
      {
        for (rint i=0;i<n;i++)
          if (i>r[i]) swap(a[i],a[r[i]]);
        for (rint i=1;i<n;i*=2)
        {
          dob wn(cos(pi/i),sin(pi*o/i)),x,y;
          for (rint j=0;j<n;j+=(i*2))
          {
            dob w(1,0);
            for (rint k=0;k<i;k++,w*=wn)
            {
              x=a[j+k],y=w*a[i+j+k];
              a[j+k]=x+y,a[i+j+k]=x-y;
            }
          }
        }
      }
      IL void query()
      {
        l=0;
        for (n=1;n<=m;n<<=1) l++;
        for (rint i=0;i<n;i++) r[i]=(r[i/2]/2)|((i&1)<<(l-1));
        fft(a,1); fft(b,1);
        for (rint i=0;i<n;i++) a[i]*=b[i];
        fft(a,-1);
        for (rint i=0;i<=m;i++) 
          sum[i]=a[i].real()/n+0.5,sum[i]%=mo;
      }
      #define mid (l+r)/2
      void cdq(int l,int r)
      {
        if (l==r) return;
        cdq(l,mid); 
        for (rint i=l;i<=mid;i++) a[i-l]=dp[i];
        m=r-l;
        rint x;
        for (x=1;x<=m;x<<=1);
        for (rint i=mid+1;i<=l+x;i++) a[i-l]=0;
        b[0]=0;
        for (rint i=1;i<=x;i++) b[i]=bb[i];
        query();
        for (rint i=mid-l+1;i<=r-l;i++)
          { 
            dp[i+l]+=sum[i];
            dp[i+l]%=mo;
          }
        cdq(mid+1,r); 
      }
      int main()
      {
        freopen("noi.in","r",stdin);
        freopen("noi.out","w",stdout);
        std::ios::sync_with_stdio(false);
        int k;
        while (cin>>k&&k)
        {
          for (rint i=1;i<=k;i++) cin>>bb[i];
          memset(dp,0,sizeof(dp));
          dp[0]=1;
          cdq(0,k);
          cout<<dp[k]%mo<<endl;
        } 
        return 0;
      }

    该改一个fft模板了,实在是慢https://www.luogu.org/record/show?rid=3767323

  • 相关阅读:
    MySql触发器简介
    MySQL存储过程
    MySQL自定义函数
    MySql视图
    MySQL增删改
    MySQL内联和外联查询
    MySql运算符
    SQL scripts
    Adding Swagger to Web API project
    Unable to get setting value Parameter name: profileName
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8916711.html
Copyright © 2011-2022 走看看