BZOJ3456【分治FFT】

原创 2015年07月07日 21:59:44

然而会TLE.

/* I will wait for you */

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <string>
#define make(a,b) make_pair(a,b)
#define fi first
#define se second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef map<int, int> mii;

const int maxn = 1000010;
const int maxm = 1010;
const int maxs = 26;
const int inf = 0x3f3f3f3f;
const ll P = 479 << 21 ^ 1;
const ll G = 3;
const double error = 1e-9;

inline ll read()
{
	ll x = 0, f = 1; char ch = getchar();
	while (ch > '9' || ch < '0' )
		f = (ch == '-' ? -1 : 1), ch = getchar();
	while (ch <= '9' && ch >= '0')
		x = x * 10 + ch - '0', ch = getchar();
	return f * x;
}

ll n, _x[maxn], _y[maxn], rev[maxn], w[2][maxn],
   f[maxn], I[maxn], nI[maxn], C[maxn];

ll _pow(ll a, ll b)
{
	ll ans = 1;
	for (; b; a = a * a % P, b /= 2)
		if (b & 1) ans = ans * a % P;
	return ans;
}

void init()
{
	n = read(), I[0] = nI[0] = 1;
	
	for (int i = 1; i <= n << 1; i++) {
		I[i] = I[i - 1] * i % P;
		nI[i] = _pow(I[i], P - 2);
	}

	for (int i = 1; i <= n << 1; i++)
		C[i] = _pow(2, 1ll * i * (i - 1) / 2);
}

void NTT(ll *a, int n, int f)
{
	for (int i = 0; i < n; i++) {
		rev[i] = 0;
		for (int j = i, k = 1; k < n; k <<= 1, j >>= 1)
			(rev[i] <<= 1) |= j & 1;
		if (rev[i] > i) swap(a[i], a[rev[i]]);
	}

	w[0][0] = w[1][0] = 1;
	for (int i = 1; i < n; i++) {
		w[0][i] = w[0][i - 1] * _pow(G, (P - 1) / n) % P;
		w[1][i] = _pow(w[0][i], P - 2);
	}

	for (int i = 1; i < n; i <<= 1)
	for (int j = 0, l = n / (i << 1); j < n; j += (i << 1))
	for (int k = 0, t = 0; k < i; k += 1, t += l) {
		ll x = a[j + k], y = w[f][t] * a[i + j + k] % P;
		a[j + k] = (x + y) % P, a[i + j + k] = (x - y + P) % P;
	}

	for (int i = 0; f && i < n; i++)
		a[i] = a[i] * _pow(n, P - 2) % P;
}	

void solve(int l, int r)
{
	int mid = (r + l) / 2, len = 1;

	if (l == r) {
		f[mid] = C[mid] - I[mid - 1] * f[mid] % P;
		f[mid] = (f[mid] + P) % P; return;
	}

	while (1 << len < (r - l) << 1) len += 1;

	solve(l, mid);

	for (int i = 0; i <= 1 << len; i++)
		_x[i] = _y[i] = 0;
	for (int i = l; i <= mid; i++)
		_x[i - l] = nI[i - 1] * f[i] % P;
	for (int i = l; i <= r; i++)
		_y[i - l] = C[i - l] * nI[i - l] % P;

	NTT(_x, 1 << len, 0);
	NTT(_y, 1 << len, 0);
	for (int i = 0; i <= 1 << len; i++)
		_x[i] = _x[i] * _y[i] % P;
	NTT(_x, 1 << len, 1);

	for (int i = mid + 1; i <= r; i++)
		f[i] = (f[i] + _x[i - l]) % P;	

	solve(mid + 1, r);
}

int main()
{
	init(), solve(1, n), printf("%lld\n", f[n]);	

	return 0;
}

hdu 5730 Shell Necklace(2016多校第一场)FFT+分治

dp[i]=sigma(dp[j]*a[i-j]) 具有多项式形式可以考虑fft,但是直接会T,考虑cdq分治,每次分治时跑fft即可 #include #include #include #i...
  • u013665921
  • u013665921
  • 2016年07月20日 15:13
  • 1369

FFT黑科技(拆系数FFT)

前言由于莫名其妙就被分配了给校内同学讲fft的任务,于是要去学一点黑科技来增长见识带模数—拆系数FFT设模数为MM,M0=[M−−√]M_0=[\sqrt M],那么一个数xx可以表示为x=k×M0+...
  • samjia2000
  • samjia2000
  • 2017年03月24日 22:25
  • 860

fft

模板。。。看完算导,还是没能太理解,智商有限。
  • ACpac
  • ACpac
  • 2014年07月31日 13:35
  • 287

HDU - 5730 CDQ分治 + FFT

题意: 有一串长度为n的序列,可以任意划分,题目给出长度从1到n的块的价值,每一种划分的价值等于划分出来的所有块的价值的乘积,问所有划分方法得到的价值的总和是多少? 思路: 这题很容易就能得...
  • Bahuia
  • Bahuia
  • 2017年03月21日 14:15
  • 205

HDU 5730 Shell Necklace(CDQ分治+FFT)

Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 Input 多组用例,每组用例首先输入一整数n表示链长...
  • V5ZSQ
  • V5ZSQ
  • 2016年07月25日 15:33
  • 1209

BZOJ 3456 城市规划 快速傅里叶变换

题目大意:求nn个点的无向简单连通图个数,n≤1.3∗105n\leq1.3*10^5 递推式:fi=2C2i−∑i−1j=1fj∗Cj−1i−1∗2C2i−jf_i=2^{C_i^2}-\sum_...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年05月27日 17:08
  • 3093

BZOJ3451 Normal 点分治+FFT

题意:陈老师在点分治时随机选择重心然后分治,每次代价为树的大小,求期望代价 n Sol: 这只是Normal 啊!!Lunatic要难成什么样啊TAT 由期望的线性性质,我们可以算出每个点的期...
  • Flere825
  • Flere825
  • 2017年06月08日 23:26
  • 185

FFT详解

一直想学FFT,当时由于数学基础太差,导致啥都学不懂。请教了机房里的几位学长大神,结果还是没太明白。因此下定决心写一篇关于“FFT”的文章,一篇起码我能看得懂的“FFT”。...
  • GGN_2015
  • GGN_2015
  • 2017年03月31日 10:28
  • 2894

BZOJ 3456 城市规划 多项式求ln

BZOJ 3456 城市规划 多项式求ln
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月14日 10:05
  • 1508

[bzoj3456]城市规划

题目大意 给你n个点(存在顺序性),初始无边,你可以任意加边。求满足以下条件的连通图数量:无重边无自环。答案模479∗221+1479 * 2 ^{21} + 1 DP 我们设f[i]表示i个点...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2015年12月23日 20:31
  • 771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ3456【分治FFT】
举报原因:
原因补充:

(最多只允许输入30个字)