这应该是ACM中比较高级的数学知识了.弱渣今天学习了一下.
reference:
组合数学
母函数
FFT
FFT
卷积
多项式乘法运算
FFT例题,转为母函数求卷积
莫比乌斯反演
母函数:
构造这么一个多项式函数g(x),使得x的n次方系数为f(n)。
1.“把组合问题的加法法则和幂级数的乘幂对应起来。”
2.“把离散数列和幂级数一 一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造。“
有1克、2克、3克、4克砝码各一枚,问你能称出哪几种重量?每种重量各有几种方案?
下面是用母函数解决这个问题的思路:
首先,我们用X表示砝码,X的指数表示砝码的重量。那么,如果用函数表示每个砝码可以称的重量,
1个1克的砝码可以用函数X^0 + X^1表示,
1个2克的砝码可以用函数X^0 + X^2表示,
依次类推。
如果我们把上面2个多项式相乘,可以得到X^0 + X^1 + X^2 + X^3。继续把它与X^0 + X^3相乘,得到X^0 + X^1 + X^2 + 2*X^3 + X^4 + X^5 + X^6。
聪明的你,是不是发现了什么?
如果没有,接着把它与X^0+X^4相乘,最后得到X^0 + X^1 + X^2 + 2*X^3 + 2*X^4 + 2*X^5 + 2*X^6 + 2*X^7 + X^8 + X^9 + X^10。
由于X的指数表示的是重量,所以,在相乘时,根据幂的运算法则(同底幂相乘,指数相加),得到的结果正是所有的方案。而且,每个X前面的系数代表它有几种方案。
真是神奇啊。。。。
需要注意的是,如果有2个1克的砝码,应该用X^0 + X^1 + X^2表示,而不是X^0 + 2*X^1。
母函数还可以解决其他问题,比如,整数划分。
整数划分是个很经典的问题,划分规则就不再细述,直接说思路。与上面的问题相比,每种砝码的个数不再是1个,而是无限个。于是,
1克的砝码可以用X^0 + X^1 + X^2 + X^3 ……表示,
2克的砝码可以用X^0 + X^2 + X^4 + X^6……表示,
3克的砝码可以用X^0 + X^3 + X^6 + X^9……表示,
依次类推。
相乘后求出X^n的系数,就是结果
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=50;
int c1[N+10],c2[N+10],num[30];
int main(){
//freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
memset(c1,0,sizeof(c1)); //c1[ ]保存当前得到的多项式各项系数
memset(c2,0,sizeof(c2)); //c2[ ]保存每次计算时的临时结果
for(int i=1;i<=26;i++)
scanf("%d",&num[i]);
c1[0]=1; //相当于用X^0去乘以后面的多项式
for(int i=1;i<=26;i++){ //要乘以26个多项式
for(int j=0;j<=N;j++) //c1的各项的指数
for(int k=0;k<=num[i] && j+k*i<=N;k++) //k*i表示被乘多项式各项的指数,(X^0*i + X^1*i + X^2*i + ……)
c2[j+k*i]+=c1[j]; //指数相加得j+k*i,加多少只取决于c1[j]的系数,因为被乘多项式的各项系数均为1
for(int j=0;j<=N;j++){
c1[j]=c2[j];
c2[j]=0;
}
}
int ans=0;
for(int i=1;i<=N;i++)
ans+=c1[i];
printf("%d\n",ans);
}
return 0;
}
FFT
这个玩意是信号系统里面的东西,化连续为离散.核心思想是
1. 点值表示法代替系数表示法可以降低复杂度(一个点上的数值直接相乘)
2. 将系数表示法转换为点值表示法用单位复根,这样结果为1
3. 计算过程中使用分治法并且有蝴蝶变化,具体看参考吧.
卷积
这个概念我是着实理解了很久,关键是要直观,直观,直观.
一句话来说就是求历史影响累计和.
一、组合数学:
1、 Polya定理、burnside定理
http://blog.csdn.net/ACM_cxlove/article/details/7453061
http://wenku.baidu.com/view/3dc7027602768e9951e738ca.html
http://blog.csdn.net/xuzengqiang/article/details/7476671
pku2409Let it Bead
pku2154Color//LTC
pku1286Necklace of Beads
pku2888 Magic Bracelet
poj1286 poj2409 poj3270 poj1026
2、 置换,置换的运算
http://www.cnblogs.com/DreamUp/archive/2010/08/17/1801700.html
pku3270 Cow Sorting
pku1026 Cipher
pku1721 CARDS
pku3128 Leonardo's Notebook
pku3590 The shuffleProblem
3、 排列组合,区间计数,计数序列
http://hi.baidu.com/nicker2010/item/fea0a5254208a30377272ced
pku1850 Code
pku1150 The Last Non-zero Digit
pku1715 Hexadecimal Numbers
pku2282 The Counting Problem
pku3286 How many 0's?
pku3252 Round Numbers
pku1430 Binary Stirling Numbers
pku2515 Birthday Cake
pku1707 Sum ofpowers
4、 抽屉原理、容斥原理
http://www.cppblog.com/vici/archive/2011/09/05/155103.html
pku2365 Find a multiple
pku3370 Halloween treats
hdu1695 GCD
hdu2461Rectangles
5、 递推关系
(POJ3252,poj1850,poj1019,poj1942)
6、 母函数
http://wenku.baidu.com/view/c0f7ee05cc1755270722080d.html
http://blog.csdn.net/ACM_cxlove/article/details/7831070
http://blog.csdn.net/lishuhuakai/article/details/8044431
HDU 1028 HDU 1398 HDU 1085
7、 MoBius反演
http://blog.csdn.net/acdreamers/article/details/8542292
(poj2888,poj2154)
8、 偏序关系理论
(POJ3252,poj1850,poj1019,poj1942)
二、数论.
1、 素数与整除问题
2、 进制位.
3、 同余模运算.
http://blog.csdn.net/chocolate_22/article/details/6458029
(poj2635, poj3292,poj1845,poj2115)
4、 欧拉函数
http://so.csdn.net/search?q=blog%3Ailovexiaohao+%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0&t=blog
http://blog.csdn.net/mbxc816/article/details/7214872
http://blog.sina.com.cn/s/blog_622bd1660100k1eq.html
pku1284
pku2407 Relatives
pku2773 Happy 2006
pku2478 Farey Sequence (快速求欧拉函数)
pku3090 Visible Lattice Points
Pku3358 Period of an Infinite Binary Expansion
三、计算方法
1、 二分法求解单调函数相关知识.
http://blog.csdn.net/xh_reventon/article/category/1335754
pku3273Monthly Expense
pku3258River Hopscotch
pku1905Expanding Rods
pku3122Pie
pku1845 Sumdiv
(poj3273,poj3258,poj1905,poj3122)
2、 三分法求解单峰(单谷)的极值.
http://blog.csdn.net/xh_reventon/article/details/8551235
http://wenku.baidu.com/link?url=Q5QCNa9UI0xzCaWzGrNiIPQYizTV6kaCwT7XtgQBU7EVz_-_jV5VRNPuOjabJKnFAY0crwI5Gvtlz5mFz85ah5miXfu6kO2frITx3MvZbge
3、 0/1分数规划. (poj2976)
http://wenku.baidu.com/view/eb5483a7284ac850ad02429c.html
http://blog.sina.com.cn/s/blog_6383bcba0100xf4z.html
4、 矩阵法
http://blog.csdn.net/acm_cxlove/article/details/7815594
(poj3150,poj3422,poj3070)
5、 随机化算法(poj3318,poj2454)
http://blog.csdn.net/changyuanchn/article/details/17278895
http://wenku.baidu.com/view/ae079efa0242a8956bece42b.html
6、 迭代逼近(poj3301)
http://www.cnblogs.com/ggzwtj/archive/2012/03/08/2385394.html
四、计算几何
http://blog.csdn.net/archibaldyangfan/article/details/8043371
http://wenku.baidu.com/view/2043b3cab9f3f90f76c61b67.html
http://wenku.baidu.com/view/d6b81c19227916888486d767.html
1、 叉积和点积的运用(如线段相交的判定,点到线段的距离等).
(poj2031,poj1039)
2、 多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
3、 二维、三维凸包
http://wenku.baidu.com/view/8eb16d503c1ec5da50e270c4.html
http: