有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. 基于spec评论作品

    组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶  刘佳瑞  公冶令鑫  杨磊  杨金铭  张宇  卢帝同 一.测试目标:拉格朗日2018——飞词 下面是他们的小游戏在运行时的一些截图画面: 1.开始: ...

  2. 渡过OO的死劫,了解规格的意义——OO第三次博客总结

    当熬过了一次次黑暗,迎接我们的却是被扣的惨不忍睹的JSF ┭┮﹏┭┮ 一.总结调研 规格的历史 传统科学的特点是发现世界,而软件的特点是构造世界.软件的最底层就是0,1,两个离散的值.程序设计语言的三 ...

  3. servlet几个常用的方法

    servlet继承了HTTPServlet所以可以重写父类的方法,下面一 一介绍方法Dopost DoGet 比较常用不再介绍. 一.Init(),和Init(ServletConfig config ...

  4. Leetcode题库——28.实现strStr()

    @author: ZZQ @software: PyCharm @file: strStr.py @time: 2018/11/6 20:04 要求:给定一个 haystack 字符串和一个 need ...

  5. ubuntu下screen的使用

    ubuntu下screen的使用 日常在通过SSH远程到服务器训练网络和深度学习的相关代码,经常需要花费很长的时间.利用SSH远程连接服务器,运行程序需要保证在此期间窗口不能关闭并且连接不能断开,否则 ...

  6. 根据C#编程经验思考编程核心

    程序是对数据的各种操作.数据的表示,数据的组织结构,数据的存储,数据的处理,数据的传输等. 程序是由具体的编程语言编写的,不同的编程语言有编写,编译检查,解释执行等过程. 具体的编程语言都有: 1,变 ...

  7. salt-api使用

    salt-api 基本使用 目前salt API 支持的web模块如下: CherryPy Tornado WSGI 1.安装salt-api salt 使用 CherryPy来实现restful的a ...

  8. Unity发布Exe后,去掉提示分辨率的窗口

    Unity版本:2017.4 菜单File->Build Settings...,修改如下图的位置,将“Display Resolution Dialog”从Enabled改为Disabled

  9. OSI协议和TCP/IP协议笔记

    1.OSI协议: 第7层应用层:OSI中的最高层.是用户与网络的接口.该层通过应用程序来完成网络用户的应用需求,如文件传输.收发电子邮件等.在此常见的协议有:HTTP,HTTPS,FTP,TELNET ...

  10. eclipse+IDEA快捷键记录

    Eclipse中自动获取 IDEA中:ctrl+alt+v==alt+shift+l 其它   (有些地方前面的C代表Ctrl .S代表Shift.A代表Alt) Ctrl+Shift+F       ...