数学挖坑待填......(FFT/母函数/莫比乌斯反演...)

这应该是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



30/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:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值