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 ...
随机推荐
- 7.openldap使用ssl加密认证
作者:yaoyao 1.服务器端部署 1.自建CA中心 1.CA中心生成自身私钥 #cd /etc/pki/CA #(umask 077; openssl genrsa -out private/ca ...
- rename命令详解
基础命令学习目录首页 原文链接:http://man.linuxde.net/rename 将main1.c重命名为main.c rename main1.c main.c main1.c renam ...
- 点击小图查看大图jQuery插件FancyBox魔幻灯箱
今日发现一个不错的JQuery插件FancyBox,也许早就有这个插件了,但是没名字,我就暂且叫他魔幻灯箱吧,采用Mac系统的样式.网传主要有以下功能:■弹出的窗口有很漂亮的阴影效果.■关联的对象(就 ...
- Openresty(Lua+Nginx)实践
简介: OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. OpenRest ...
- 【Oracle】存储过程在字符串单引号'内拼接单引号'
http://blog.csdn.net/u011704894/article/details/44976557 一般变量里面接3个单引号 eg: 'DELETE FROM RDM_SUPP_DATA ...
- Daily Scrum (2015/10/23)
这天晚上PM和我一起细算下来这周的确做了不少事儿.由于这天是周五,有的组员今晚有外出活动,有的组员忙了一周想休息一下.所以PM与我讨论提出今晚就布置些阅读的任务,给组员们一些自由分配的时间: 成员 今 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...
- cnblogs用户体验及建议
一.是否提供了良好的体验给用户(同时提供价值)? 我觉得博客园还是给用户提供了良好的用户体验的,它可以从用户的角度考虑,用户在注册的时候,用户自己在设置用户名和密码的时候,如果与他人重复会有提示,而且 ...
- Task 8 找水王
任务: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你 ...
- 软工1816 · Beta冲刺(7/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 协助完成安卓端的整合 完成安卓端的美化 协助制作宣传视频 接下来的计划 &am ...