HDU5730 Shell Necklace


题目大意

已知连续i(1<=i<=n)个贝壳组合成一段项链的方案数a[i],求组合成包含n个贝壳的项链的总方案数。

Solution

  1. cdq分治

我们考虑最朴素的\(dp​\).

设\(f_i​\)表示包含\(i​\)个贝壳的方案数,很容易写出转移方程:

\(f_i=\sum_{j=1}^if_{i-j}×a_j\)

发现这个dp方程直接转移是\(O(n^2)\)的,要优化一下....

这个式子不就是分治FFT的式子?

直接cdq不就好了吗?

  1. 多项式求逆

考虑这个东西怎么求逆对吧.

生成函数构出来直接就可以求式子了...(坑+1)

代码实现

分治FFT

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=1000010,Mod=313;
const double Pi=acos(-1.0);
int a[N],dp[N],n;
struct node
{
    double x,y;
    node operator+(const node b)const{return (node){x+b.x,y+b.y};}
    node operator-(const node b)const{return (node){x-b.x,y-b.y};}
    node operator*(const node b)const{return (node){x*b.x-y*b.y,x*b.y+y*b.x};}
}A[N],B[N];
int r[N],limit;
void FFT(node *A,int type)
{
    for(int i=0;i<limit;i++)
        if(i<r[i])swap(A[i],A[r[i]]);
    for(int mid=1;mid<limit;mid<<=1)
    {
        node Root=(node){cos(Pi/mid),type*sin(Pi/mid)};
        for(int R=mid<<1,j=0;j<limit;j+=R)
        {
            node Mi=(node){1,0};
            for(int k=0;k<mid;k++,Mi=Mi*Root)
            {
                node X=A[j+k],Y=Mi*A[j+mid+k];
                A[j+k]=X+Y;
                A[j+mid+k]=X-Y;
            }
        }
    }
}
void cdq(int l,int R)
{
    if(l==R)
    {
        dp[l]=(dp[l]+a[l])%Mod;
        return;
    }
    int mid=(l+R)>>1;
    cdq(l,mid);
    limit=1;int L=0,len=R-l+1;
    while(limit<=len)limit<<=1,L++;
    for(int i=0;i<limit;i++)
        r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
    for(int i=0;i<limit;i++)A[i].x=B[i].x=0,A[i].y=B[i].y=0;
    for(int i=l;i<=mid;i++)A[i-l].x=dp[i],A[i].y=0;
    for(int j=1;j+l<=R;j++)B[j-1].x=a[j],B[j-1].y=0;
    for(int i=mid-l+1;i<=R-l;i++)
        A[i].x=0,A[i].y=0;
    for(int i=len;i<limit;i++){
        A[i].x=0;A[i].y=0;
        B[i].x=0;B[i].y=0;
    }
    FFT(A,1);FFT(B,1);
    for(int i=0;i<limit;i++)
        A[i]=A[i]*B[i];
    FFT(A,-1);
    for(int i=0;i<limit;i++)
        A[i].x=A[i].x/limit;
    for(int i=mid+1;i<=R;i++)
    {
        dp[i]+=((ll)(A[i-l-1].x+0.5))%313;
        dp[i]%=313;
    }
    cdq(mid+1,R);
}
int main()
{
    while(scanf("%d",&n)==1 && n)
    {
        for(int i=1;i<=n;i++)a[i]=gi()%Mod;
        memset(dp,0,sizeof(dp));
        cdq(1,n);
        printf("%d\n",dp[n]);
    }
    return 0;
}

多项式求逆

挖坑待补

【HDU5730】 Shell Necklace的更多相关文章

  1. 【HDU5730】Shell Necklace(多项式运算,分治FFT)

    [HDU5730]Shell Necklace(多项式运算,分治FFT) 题面 Vjudge 翻译: 有一个长度为\(n\)的序列 已知给连续的长度为\(i\)的序列装饰的方案数为\(a[i]\) 求 ...

  2. 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    [转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...

  3. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  4. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. 【Markdown】Shell命令高亮显示

    [问题]shell命令,黏贴到简书的代码块上,#后面的命令显示成被注释掉的效果 image.png [目的]高亮显示shell命令 [方案1]在代码块标示符后,加上此代码块所用的语言名(请注意要用小写 ...

  7. 【原】shell编写一个简单的jmeter自动化压测脚本

    在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...

  8. 【二分】Shell Pyramid

    [来源]:2008年哈尔滨区域赛 [题目链接]: http://acm.hdu.edu.cn/showproblem.php?pid=2446 [题意] 题目是真的长呀,其实就问一个问题. 按照图里面 ...

  9. 【HDU 5730】Shell Necklace

    http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...

随机推荐

  1. 嵌入式操作系统VxWorks中网络协议存储池原理及实现

    嵌入式操作系统VxWorks中网络协议存储池原理及实现 周卫东 蔺妍 刘利强 (哈尔滨工程大学自动化学院,黑龙江 哈尔滨,150001) 摘  要  本文讨论了网络协议存储池的基本原理和在嵌入式操作系 ...

  2. Windows 8 Stroe Apps 控件

    重新想象 Windows 8 Store Apps (3) - 控件之内容控件: ToolTip, Frame, AppBar, ContentControl, ContentPresenter; 容 ...

  3. [C#]“正在终止线程”的问题

    在C#中启用线程后,如果试图使用Abort方法来终止线程,那么必定会抛出“正在终止线程”的异常,一开始我也想过如何来避免这种异常出现,花了不少气力,但最后发现全是徒劳. 原因是一个正在运行的线程被终止 ...

  4. 导入mysql报错问题

    今天数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题 2个解决方法: 1.临时修改:mysql>set global max ...

  5. tensorflow下识别手写数字基于MLP网络

    # coding: utf-8 # In[1]: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_da ...

  6. 正则表达式,re模块

    一.正则表达式 正则表达式 : 匹配字符串,一般用于爬取数据. 正则表达式查询网址 : http://tool.chinaz.com/regex/?qq-pf-to=pcqq.group 1.元字符( ...

  7. 2019.01.09 bzoj2599: [IOI2011]Race(点分治)

    传送门 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 思路: 考虑点分治如何合并. 我们利用树形dpdpdp求树的直径的方法,边dfsdfsdfs子树边统计答案即可. 代码: ...

  8. ASP项目部署IIS7.5中遇到的问题

    我们大家都熟悉了tomcat服务器的部署,如果是一个ASP项目如何部署呢.这也是我在客户现场遇到的问题.ASP项目一般是用的系统组件IIS来部署项目.下面我讲一下自己在部署过程中遇到的问题. 如果在网 ...

  9. Codeforces 1060E(思维+贡献法)

    https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...

  10. IntellJ IDEA 2017 激活编译器配置,读取多个配置文件

    1.设置编译器,找到1,点击2 2.输入设置命令:--spring.profiles.active=test,如果是多个文件输入--spring.profiles.active=test,dev 3. ...