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=;i<n;i++)
    if (i>r[i]) swap(a[i],a[r[i]]);
    for (rint i=;i<n;i*=)
    {
    dob wn(cos(pi/i),sin(pi*o/i)),x,y;
    for (rint j=;j<n;j+=(i*))
    {
    dob w(,);
    for (rint k=;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=;
    for (n=;n<=m;n<<=) l++;
    for (rint i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
    fft(a,); fft(b,);
    for (rint i=;i<n;i++) a[i]*=b[i];
    fft(a,-);
    for (rint i=;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=;x<=m;x<<=);
    for (rint i=mid+;i<=l+x;i++) a[i-l]=;
    b[]=;
    for (rint i=;i<=x;i++) b[i]=bb[i];
    query();
    for (rint i=mid-l+;i<=r-l;i++)
    {
    dp[i+l]+=sum[i];
    dp[i+l]%=mo;
    }
    cdq(mid+,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=;i<=k;i++) cin>>bb[i];
    memset(dp,,sizeof(dp));
    dp[]=;
    cdq(,k);
    cout<<dp[k]%mo<<endl;
    }
    return ;
    }

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

最新文章

  1. OSError: libcudart.so.7.5: cannot open shared object file: No such file or directory
  2. 使用github pages, hexo搭建个人博客教程
  3. js框架设计1.1命名空间笔记
  4. DBHelper (支持事务与数据库变更)
  5. Eclipse 寻找迷失的ID
  6. POJ2996Help Me with the Game
  7. 总结的Ubuntu的若干小知识
  8. linux上gcc
  9. C#里4个访问权限修饰符
  10. IIC 概述之3
  11. linux下检测端口是否连通
  12. 前端模块化之seajs
  13. mac上Python多版本共存
  14. 你真的了解ASP.NET Core 部署模型吗?
  15. jsp内置对象-exception对象
  16. python 数据分析算法(决策树)
  17. 使用LinkedList类生成一个集合对象,循环加入“小样1”,“小样2”,“小样3”,“小样4”,“小样5”……“小样100”。输出这个集合的大小。再使用循环删除这个集合中所有名字为偶数的对象,比如“小样6”,“小样100”,都是偶数名。最后:循环输出集合中所有的对象,看是否删除成功。
  18. 【七】jquery之属性attr、 removeAttr、prop[全选全不选及反选]
  19. cocos2d-x3.17 整体概述
  20. poj2828 伸展树模拟

热门文章

  1. 海明码 CRC冗余校验码
  2. JAVA中equals方法与hashCode方法学习
  3. 词典的实现(4)-使用Hash方式来实现词典
  4. qemu基本使用
  5. yolov3实践(二)
  6. vue学习一:新建或打开vue项目(vue-cli2)
  7. mysql 案例 ~ 瘦身mysql系列(1)
  8. drozer工具的安装与使用:之一安装篇
  9. DropEditText
  10. 首次使用Vue开发