HDU - 5730 Shell Necklace
时间:2019-03-19
本文章向大家介绍HDU - 5730 Shell Necklace,主要包括HDU - 5730 Shell Necklace使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
不难想到DP方程f[i]=sigema(0,i-1)j f[j]*a[i-j]
这是一个卷积,然而并不能直接卷
上分治fft
注意ntt用不了。。。313=2^3*3*13+1
推的我心态都崩了
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; typedef long double LD; const int _=1e2; const int maxn=1e5+_; const int fbin=((1<<17)<<1)+_; const int mod=313; const double pi=acos(-1.0); struct complex { LD r,i; complex(){} complex(double R,double I){r=R,i=I;} friend complex operator +(complex c1,complex c2){return complex(c1.r+c2.r,c1.i+c2.i);} friend complex operator -(complex c1,complex c2){return complex(c1.r-c2.r,c1.i-c2.i);} friend complex operator *(complex c1,complex c2){return complex(c1.r*c2.r-c1.i*c2.i,c1.r*c2.i+c2.r*c1.i);} }A[fbin],B[fbin]; int Re[fbin],h[fbin]; void FFT(complex *a,int n,int op) { for(int i=0;i<n;i++) if(i<Re[i])swap(a[i],a[Re[i]]); for(int i=1;i<n;i<<=1) { complex wn(cos(pi/i),sin(op*pi/i)); for(int j=0;j<n;j+=(i<<1)) { complex w(1,0); for(int k=0;k<i;k++,w=w*wn) { complex t1=a[j+k],t2=a[j+k+i]; a[j+k]=t1+w*t2; a[j+k+i]=t1-w*t2; } } } if(op==-1) for(int i=0;i<n;i++) h[i]=(LL)(A[i].r/n+0.5)%mod,a[i].i=0; } int a[maxn],f[maxn]; void solve(int l1,int r1,int l2,int r2) { int d1=(r1-l1+1),d2=(r2-l2+1); int n,m,L; m=d1+d2-1;for(n=1,L=0;n<m;n*=2,L++); for(int i=0;i<n;i++)Re[i]=(Re[i>>1]>>1)|((i&1)<<(L-1)); for(int i=0;i<n;i++)A[i].r=A[i].i=B[i].r=B[i].i=0; for(int i=0;i<d1;i++)A[i].r=f[i+l1]; for(int i=0;i<d2;i++)B[i].r=a[i+l2]; FFT(A,n,1),FFT(B,n,1); for(int i=0;i<n;i++)A[i]=A[i]*B[i]; FFT(A,n,-1); } void cdq(int l,int r) { if(l==r)return ; int mid=(l+r)/2; cdq(l,mid); solve(l,mid,1,r-l); for(int i=mid+1,j=mid-l;i<=r;i++,j++) f[i]=(f[i]+h[j])%mod; cdq(mid+1,r); } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); int n; while(scanf("%d",&n)!=EOF) { if(n==0)break; for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]%=mod; memset(f,0,sizeof(f)); f[0]=1; cdq(0,n); // for(int i=1;i<n;i++)printf("%d ",f[i]); printf("%d\n",f[n]); } return 0; }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2015.CCF计算机软件能力认证试题第二题
- Codeforces Round #547 (Div. 3)A. Game 23
- Codeforces Round #547 (Div. 3)C. Polycarp Restores Permutation
- 动态规划入门_数塔问题
- Rust所有者被修改了会发生什么?
- 如何编写高质量代码
- 动态规划入门_钱币兑换问题
- Codeforces Round #547 (Div. 3)D. Colored Boots
- JavaScript 性能优化
- 优化循环的方法-循环展开
- 程序性能优化-局部性原理
- Codeforces Round #547 (Div. 3)E. Superhero Battle
- 《动态规划_入门 LIS 问题 》
- 栅格化系统的原理以及实现
- vue-qr二维码插件使用简介