有n个小朋友,m颗糖,你要把所有糖果分给这些小朋友。

规则第 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型的快速幂(需要强有力的推导公式能力)的更多相关文章

  1. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  2. BZOJ 2510: 弱题( 矩阵快速幂 )

    每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献 用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK) --- ...

  3. 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)* ...

  4. BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...

  5. BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS

    三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...

  6. BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  7. BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)

    3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...

  8. BZOJ 2751 容易题(easy) 快速幂+快速乘

    2751: [HAOI2012]容易题(easy) Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i] ...

  9. BZOJ 1898 构造矩阵+矩阵快速幂

    思路: T的最小公倍数是12 那么12以内暴力 整除12 的部分用矩阵快速幂 //By SiriusRen #include <cstdio> #include <cstring&g ...

随机推荐

  1. JVM新生代老年代详解

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  2. Linux上安装设置mysql 5.7.24

    一,准备 1,先查看Linux是32位还是64位 getconf LONG_BIT 如果返回的是32,那么就是32位 如果返回的是64,那么就是64位 2,如果服务器不能联网,就先去官网下载好压缩包, ...

  3. HTML基础学习总结

    一.HTML的一些基本描述 全称:Hyper Text Markup Language 定义:超文本标记语言,是标记语言而不是编程语言,使用标记标签来描述网页,所以也被称为网页 格式:标签对里面放纯文 ...

  4. Teamwork(The fifth day of the team)

    在前面几天的努力中,我们已经完成了一些自己的工作,还有的就是一些完善,因为在前段时间一直都在寻找和配置Eclipse+Android SDK,由于版本和一些网络的阻碍,总是不能如愿的很好完成,经过了一 ...

  5. Week2-作业一——《构建之法》三章精读之想

    Week2-作业一——精读<构建之法> 前言 其实我本人是不经常看书的,电子书倒是看了不少,实体书真的不经常看,但是为了这次作业的需求,我还是选择静下心来阅读一下这本<构建之法> ...

  6. NET Core Mvc发布带视图文件的方法!

    添加节点:<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>

  7. form表单转化json对象

    利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; ...

  8. Appium 服务关键字(转)

    来源: https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md#appium-服务 ...

  9. Linux服务器学习(二)

    昨天简单了解了linux的基础命令,今天学习linux搭建环境(安装文件,配置文件)及权限操作. 一.搭建lnmp环境 lnmp指Linux+Nginx+Mysql+PHP Ubuntu安装文件命令为 ...

  10. ACM数论之旅13---容斥原理(一切都是命运石之门的选择(=゚ω゚)ノ)

    容斥原理我初中就听老师说过了,不知道你们有没有听过(/≧▽≦)/ 百度百科说: 在计数时,必须注意没有重复,没有遗漏. 为了使重叠部分不被重复计算,人们研究出一种新的计数方法. 这种方法的基本思想是: ...