[HDU 5730] Shell Necklace (FFT+CDQ分治)
来源:互联网 发布:九龙医院网络预约 编辑:程序博客网 时间:2024/05/08 01:00
HDU - 5730
给定一段长度为
N 的序列,长度为i 的连续一段有ai 种染色方案
问一共有多少中染色方案,其中N≤105
一个很显然的dp方程,设
这很显然就是一个卷积的形式……所以用上 FFT就可以了
但是问题在于,
这样一来,时间复杂度就是
所以我们还要用上 CDQ分治的思想
对于一段区间,先算出前半段的 dp值,再与 a值卷积,然后产生对后半段的贡献
这样分治地去算,时间复杂度就是
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <cctype>#include <map>#include <set>#include <queue>#include <bitset>#include <string>#include <complex>using namespace std;typedef pair<int,int> Pii;typedef long long LL;typedef unsigned long long ULL;typedef double DBL;typedef long double LDBL;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define SQR(a) ((a)*(a))#define PCUT puts("\n----------")const int maxn=1e5+10, MOD=313, maxl=1<<19;const DBL PI = acos(-1.0);typedef complex<DBL> clx;int N, W[maxn], dp[maxn];clx A[maxl], B[maxl];void conv(int,clx*,clx*);void FFT(int,clx*,int);void cdq(int,int);int main(){ #ifdef LOCAL freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout); #endif while(~scanf("%d", &N) && N) { for(int i=1; i<=N; i++) scanf("%d", &W[i]), W[i]%=MOD; CLR(dp); dp[0]=1; cdq(0,N); printf("%d\n", dp[N]); } return 0;}void cdq(int l, int r){ if(l==r) return; int mid=(l+r)>>1, len=1; while(len <= 2*(r-l+1)) len<<=1; cdq(l,mid); for(int i=0; i<len; i++) { A[i] = clx(l+i+1<=r?W[i+1]:0, 0); B[i] = clx(l+i<=mid?dp[l+i]:0, 0); } conv(len,A,B); for(int i=mid+1; i<=r; i++) { dp[i] += fmod(A[i-l-1].real(), MOD) + 0.5; dp[i] = (dp[i]%MOD + MOD)%MOD; } cdq(mid+1, r);}void conv(int n, clx A[], clx B[]){ FFT(n,A,1); FFT(n,B,1); for(int i=0; i<n; i++) A[i]=A[i]*B[i]; FFT(n,A,-1);}void FFT(int n, clx A[], int dir){ for(int i=0,j=0; i<n; i++) { if(i<j) swap(A[i], A[j]); for(int k=n>>1; (j^=k)<k; k>>=1); } clx wn,w,z; for(int len=2,m,i,j; len<=n; len<<=1) { m=len>>1; wn = clx(cos(dir*2.0*PI/len), sin(dir*2.0*PI/len)); for(i=0; i<n; i+=len) { w = clx(1.0, 0.0); for(j=0; j<m; j++) { z = A[i+m+j]*w; A[i+m+j] = A[i+j] - z; A[i+j] += z; w *= wn; } } } if(dir==-1) for(int i=0; i<n; i++) A[i] /= n;}
0 0
- hdu 5730 Shell Necklace cdq分治+FFT
- HDU 5730 Shell Necklace(CDQ分治+FFT)
- [HDU 5730] Shell Necklace (FFT+CDQ分治)
- HDU 5730 多校1 Shell Necklace (CDQ分治+FFT)
- HDU 5730 Shell Necklace(dp+cdq分治+FFT优化)
- HDU 5730 Shell Necklace(FFT+分治)
- Hdu 5730 Shell Necklace(cdq+fft)
- HDU 5730 (CDQ分治 FFT)
- [DP] [1D1D优化] [FFT] [CDQ分治] [HDU5730] Shell Necklace
- 【HDU5730】Shell Necklace——CDQ+FFT
- hdu 5730 Shell Necklace(2016多校第一场)FFT+分治
- hdu 5730 (CDQ+FFT)模板题
- 【HDU5730 2016 Multi-University Training Contest 1H】【FFT + cdq 分治】 Shell Necklace f[i]=∑f[i-j] x a[j]
- BZOJ3456:城市规划(EGF+FFT/CDQ分治+FFT)
- hdu 5730(分治FFT)
- HDU 5730 2016多校Contest 1 G题【CDQ分治和FFT模板】
- hdu 5730 Shell Necklace
- HDU 5730 Shell Necklace
- android中ineten的七大属性
- 迷宫探索
- 202. Happy Number
- 区断标记
- Android project编译使用的JDK版本问题
- [HDU 5730] Shell Necklace (FFT+CDQ分治)
- 贝塞尔曲线初探
- Python快速学习第三天
- 表单 fieldset
- 驴友计划
- 十、自定义标题栏
- python学习中一个单线程爬虫
- POJ 1986 Distance Queries(查询两点距离,LCA)
- PHP程序员的技术成长规划