• HDU5730 Shell Necklace


    Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 999    Accepted Submission(s): 434


    Problem Description
    Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n beautiful shells contains the most sincere feeling for my best lover Arrietty, but even that is not enough.

    Suppose the shell necklace is a sequence of shells (not a chain end to end). Considering i continuous shells in the shell necklace, I know that there exist different schemes to decorate the i shells together with one declaration of love.

    I want to decorate all the shells with some declarations of love and decorate each shell just one time. As a problem, I want to know the total number of schemes.
     
    Input
    There are multiple test cases(no more than 20 cases and no more than 1 in extreme case), ended by 0.

    For each test cases, the first line contains an integer n, meaning the number of shells in this shell necklace, where 1n105. Following line is a sequence with nnon-negative integer a1,a2,,an, and ai107 meaning the number of schemes to decorate i continuous shells together with a declaration of love.
     
    Output
    For each test case, print one line containing the total number of schemes module 313(Three hundred and thirteen implies the march 13th, a special and purposeful day).
     
    Sample Input
    3 1 3 7 4 2 2 2 2 0
     
    Sample Output
    14 54
    Hint
    For the first test case in Sample Input, the Figure 1 provides all schemes about it. The total number of schemes is 1 + 3 + 3 + 7 = 14.
     
    Author
    HIT
     
    Source
     
    Recommend
    wange2014

    一段长为x的项链作为一个整体,有a[x]种装饰方案。可以把不同的整体连接起来。问长为n的项链共有多少种方案。

    动态规划 分治FFT

    设f[i]为长为i的方案数,很明显 $ f[i]=sum_{j=1}^{i} a[j]*f[i-j] $

    模数是313,这数的原根是啥啊?不知道。模数这么小,用FFT就可以了。

    PS1 注意读入a[]的时候就要顺手取模,不然很容易乘爆炸

    PS2 我也不知道为什么我要多输出一个换行符,白WA了三次才看到

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #define LL long long
     7 using namespace std;
     8 const double pi=acos(-1.0);
     9 const int mod=313;
    10 const int mxn=200010;
    11 int read(){
    12     int x=0,f=1;char ch=getchar();
    13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    15     return x*f;
    16 }
    17 struct com{
    18     double x,y;
    19     com operator + (const com &b){return (com){x+b.x,y+b.y};}
    20     com operator - (const com &b){return (com){x-b.x,y-b.y};}
    21     com operator * (const com &b){return (com){x*b.x-y*b.y,x*b.y+y*b.x};}
    22     com operator / (const double v){return (com){x/v,y/v};}
    23 }a[mxn<<2],b[mxn<<2];
    24 int N,len,rev[mxn<<2];
    25 void FFT(com *a,int flag){
    26     for(int i=0;i<N;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
    27     for(int i=1;i<N;i<<=1){
    28         com wn=(com){cos(pi/i),flag*sin(pi/i)};
    29         int p=i<<1;
    30         for(int j=0;j<N;j+=p){
    31             com w=(com){1,0};
    32             for(int k=0;k<i;k++,w=w*wn){
    33                 com x=a[j+k],y=w*a[j+k+i];
    34                 a[j+k]=x+y;
    35                 a[j+k+i]=x-y;
    36             }
    37         }
    38     }
    39     if(flag==-1)
    40         for(int i=0;i<N;i++)a[i].x/=N;
    41     return;
    42 }
    43 int n,w[mxn];
    44 LL f[mxn];
    45 void solve(int l,int r){
    46     if(l==r){(f[l]+=w[l])%=mod;return;}
    47     int mid=(l+r)>>1;
    48     solve(l,mid);
    49     int i,j,m=(r-l+1);
    50     for(N=1,len=0;N<=m;N<<=1)++len;
    51     for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
    52     //
    53     for(i=l;i<=mid;i++){a[i-l]=(com){f[i],0};}
    54     for(i=mid-l+1;i<N;i++)a[i]=(com){0,0};
    55     for(i=0;i<N;i++)b[i]=(com){w[i+1],0};
    56     //
    57     FFT(a,1);FFT(b,1);
    58     for(i=0;i<N;i++)a[i]=a[i]*b[i];
    59     FFT(a,-1);
    60     for(i=mid+1;i<=r;i++){
    61         (f[i]+=((LL)(a[i-l-1].x+0.5))%mod)%=mod;
    62     }
    63     solve(mid+1,r);
    64     return;
    65 }
    66 int main(){
    67     int i,j;
    68     while(scanf("%d",&n)!=EOF && n){
    69         memset(f,0,sizeof f);
    70         for(i=1;i<=n;i++)w[i]=read()%mod;//
    71         solve(1,n);
    72         printf("%lld
    ",f[n]%mod);
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    优麒麟(UbuntuKylin)不是国产Linux操作系统
    Win10開始菜单打不开
    五步让你玩转CocoaPods
    设计模式学习笔记之适配器模式
    感谢各位亲们的大力支持,免费的HTML5学习课程《HTML5网页开发实例具体解释》连载已经结束了!
    iOS获取时间、日期
    leetcode NO.1 两数之和 (python3实现)
    leetcode NO.53 最大子序列和 (python3实现)
    [笔记]《算法图解》第六章 广度搜索优先
    [笔记]《算法图解》第四章 快速排序
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6786460.html
Copyright © 2020-2023  润新知