bzoj 4332 FFT型的快速幂(需要强有力的推导公式能力)
规则第 i 个小朋友没有糖果,那么他之后的小朋友都没有糖果。、
如果一个小朋友分到了 xx 个糖果,那么的他的权值是 f(x) = ox^2 + sx + u
没有分到糖果的小朋友的权值是 1
每种方案的权值是各个小朋友权值的乘积
求出所有方案的权值和
设g(i,j)表示前i个小朋友分j个糖果的权值乘积和
很容易得到一个式子
这个显然是一个卷积用FFT就可以处理

但是问题来了 我们如何得到ans呢

n<=1e8 朴素的算法不太行
要想办法优化一下
然后我就被卡死了 去看了网上的各种题解
顺便拔下来了一个封装性很好的FFT板子
然后你就看的懂下面这个式子了

然后就可以套快速幂了
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <set>
#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-9
#define fi first
#define se second
#define rtl rt<<1
#define rtr rt<<1|1
#define bug printf("******\n")
#define mem(a,b) memset(a,b,sizeof(a))
#define name2str(x) #x
#define fuck(x) cout<<#x" = "<<x<<endl
#define f(a) a*a
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
#define pf printf
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)+
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define FIN freopen("data.txt","r",stdin)
#define gcd(a,b) __gcd(a,b)
#define lowbit(x) x&-x
#define rep(i,a,b) for(int i=a;i<b;++i)
#define per(i,a,b) for(int i=a-1;i>=b;--i)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
int modu;
namespace FFT {
const double pi = acos ( -1.0 );
struct cpx {
double a, b;
cpx ( double a = , double b = ) : a ( a ), b ( b ) {}
inline void init() {
a = , b = ;
}
inline cpx operator + ( const cpx &ano ) const {
return cpx ( a + ano.a, b + ano.b );
}
inline cpx operator - ( const cpx &ano ) const {
return cpx ( a - ano.a, b - ano.b );
}
inline cpx operator * ( const cpx &ano ) const {
return cpx ( a * ano.a - b * ano.b, b * ano.a + a * ano.b );
}
};
typedef cpx C;
typedef vector<C> vc;
typedef vector<int> vi; vc a, b; void DFT ( vc &a, int oper = ) {
int n = a.size();
for ( int i = , j = ; i < n; ++i ) {
if ( i > j ) swap ( a[i], a[j] );
for ( int l = n >> ; ( j ^= l ) < l; l >>= );
}
for ( int l = , ll = ; l < n; l <<= , ll <<= ) {
double x = oper * pi / l;
C omega = , omegan ( cos ( x ), sin ( x ) );
for ( int k = ; k < l; ++k, omega = omega * omegan ) {
for ( int st = k; st < n; st += ll ) {
C tmp = omega * a[st + l];
a[st + l] = a[st] - tmp;
a[st] = a[st] + tmp;
}
}
}
if ( oper == - ) for ( int i = ; i < n; ++i ) a[i].a /= n;
} vi& operator * ( const vi &v1, const vi &v2 ) {
int s = , ss = ( int ) v1.size() + ( int ) v2.size();
while ( s < ss ) s <<= ;
a.resize ( s ), b.resize ( s );
for ( int i = ; i < s; ++i ) a[i].init(), b[i].init();
for ( int i = ; i < v1.size(); ++i ) a[i] = v1[i];
for ( int i = ; i < v2.size(); ++i ) b[i] = v2[i];
DFT ( a ), DFT ( b );
for ( int i = ; i < s; ++i ) a[i] = a[i] * b[i];
DFT ( a, - );
static vi res;
res.resize ( v1.size() );
for ( int i = ; i < v1.size(); ++i ) res[i] = ( a[i].a + 0.5 ), res[i] %= modu ;
return res;
} void operator *= ( vi &v1, const vi &v2 ) {
int s = , ss = ( int ) v1.size() + ( int ) v2.size();
while ( s < ss ) s <<= ;
a.resize ( s ), b.resize ( s );
for ( int i = ; i < s; ++i ) a[i].init(), b[i].init();
for ( int i = ; i < v1.size(); ++i ) a[i] = v1[i];
for ( int i = ; i < v2.size(); ++i ) b[i] = v2[i];
DFT ( a ), DFT ( b );
for ( int i = ; i < s; ++i ) a[i] = a[i] * b[i];
DFT ( a, - );
for ( int i = ; i < v1.size(); ++i ) v1[i] = ( a[i].a + 0.5 ), v1[i] %= modu ;
} void operator += ( vi &v1, const vi &v2 ) {
for ( int i = ; i < v1.size(); ++i ) v1[i] = ( v1[i] + v2[i] + modu ) % modu;
}
} using namespace FFT;
int m, p, n, o, s, u;
vi f;
vi expmod ( const vi&v, int b ) {
vi res ( v.size(), ), tmp = v;
res[] = ;
while ( b ) {
if ( b & ) res *= tmp;
tmp *= tmp;
b = b >> ;
}
return res;
}
vi& solve ( int n ) {
static vi res, ghalf;
if ( n == ) return res = ghalf = f;
solve ( n / );
res += res * ghalf;
ghalf *= ghalf;
if ( n & ) res += expmod ( f, n ), ghalf *= f;
return res;
}
int main() {
//FIN;
sff ( m, modu );
sffff ( n, o, s, u );
f = vi ( m + , );
for ( int i = ; i < m + ; i++ ) f[i] = ( 1LL * o * i * i + s * i + u ) % modu;
vi &res = solve ( min ( n, m ) );
printf ( "%d\n", res[m] );
return ;
}
bzoj 4332 FFT型的快速幂(需要强有力的推导公式能力)的更多相关文章
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- BZOJ 2510: 弱题( 矩阵快速幂 )
每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献 用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK) --- ...
- bzoj 3240 矩阵乘法+十进制快速幂
首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...
- BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...
- BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS
三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...
- BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)
3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...
- BZOJ 2751 容易题(easy) 快速幂+快速乘
2751: [HAOI2012]容易题(easy) Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i] ...
- BZOJ 1898 构造矩阵+矩阵快速幂
思路: T的最小公倍数是12 那么12以内暴力 整除12 的部分用矩阵快速幂 //By SiriusRen #include <cstdio> #include <cstring&g ...
随机推荐
- JSBridge实现示例
前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 Hybrid APP架构设计思路 marcuswestin/WebViewJavascriptBridge 楔子 本文介绍JSBridge的完整 ...
- pairwork(黄敬博12061156和黄伟龙12061172)
结对编程: 结对编程的优缺点: 优点: 1.相互督促,共同为了完成目标而努力: 2.节省时间,通过将疑难问题分开解决,共同讨论,实现了更高效的时间利用率: 3.能力互补,提高代码的质量,同时也提高了测 ...
- Gogoing 场景调研(补)
一.典型用户 蜗居在学校的大学生 二.场景描述 编号 用户故事 故事价值 (点数) 1 作为一名大学生,只知道学习 2 经常打游戏而无所事事的大学生 1.背景 (1)典型用户:张晨建 (2)用户的需求 ...
- Leetcode题库——27.移除元素
@author: ZZQ @software: PyCharm @file: removeElement.py @time: 2018/9/23 14:04 要求:给定一个数组 nums 和一个值 v ...
- hihocoder #1388 : Periodic Signal fft
题目链接: https://hihocoder.com/problemset/problem/1388 Periodic Signal 时间限制:5000ms内存限制:256MB 问题描述 Profe ...
- 【动态规划】POJ-3616
一.题目 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her pro ...
- 基于MongoDB2.6版本配置MongoDB主从复制集群架构
1:集群环境说明:mongodb1:192.168.43.10.mongodb2:192.168.43.11.mongodb3:192.168.43.12.且基于主机名相互通信/etc/hosts文件 ...
- 基于html5的多图片上传,预览
基于html5的多图片上传 本文是建立在张鑫旭大神的多文图片传的基础之上. 首先先放出来大神多图片上传的博客地址:http://www.zhangxinxu.com/wordpress/2011/09 ...
- windows多线程(八) 信号量Semaphore
如果你看到了这里,我就认为你已经对掌握了有关关键段 CriticalSection.互斥量Mutex和事件Event有关的内容,所以最基本的东西就不再介绍了.如果没有掌握上面说的内容,可以看这里: 关 ...
- java 面试随笔
---恢复内容开始--- 1.自我介绍 2.你在项目开发过程中遇到的那些问题! 3.懂bootstrap么?简单介绍一下 4.spring的会话数据是怎样的. 5.为什么会有session 因为htt ...