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 ...
随机推荐
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- HDFS handler
http://docs.oracle.com/goldengate/bd1221/gg-bd/GADBD/GUID-85A82B2E-CD51-463A-8674-3D686C3C0EC0.htm#G ...
- Mysql DataPacketTooBigException异常处理
在本地上运行好好,然后发布到服务器上去, 总是报错,后来查了一下日志,得到了如下的错误日志: [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Pa ...
- 【quickhybrid】Android端的项目实现
前言 前文中就有提到,Hybrid模式的核心就是在原生,而本文就以此项目的Android部分为例介绍Android部分的实现. 提示,由于各种各样的原因,本项目中的Android容器确保核心交互以及部 ...
- React.js - 入门
React.js - 第1天 1. React简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 ...
- Linux上安装设置mysql 5.7.24
一,准备 1,先查看Linux是32位还是64位 getconf LONG_BIT 如果返回的是32,那么就是32位 如果返回的是64,那么就是64位 2,如果服务器不能联网,就先去官网下载好压缩包, ...
- java读取properties文件的几种方法
一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取 Properties p=new Properties(); ...
- Eclipse下高亮显示Freemarker文件
让eclipse高亮显示freemarker文件有两种方式,一种是安装JBoss的插件,一种是用JSP编辑器打开freemarker的文件.我使用第二种方式来完成. 打开eclipse,点击windo ...
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)
CAS (1) -- Mac下配置CAS到Tomcat(服务端) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2 cas-clie ...
- 使用fdisk创建好了分区,但是在生成物理卷出现"Device /dev/sdb2 not found (or ignored by filtering)."解决方法
生成物理卷出现的问题 解决方法 问题所在: 内核没有成功同步分区信息,所有才需要使用"partprobe"命令来手动同步