数论--二项式反演

若能凑出其中一个式子,则能反演出另外一个式子

 

应用:

HDU 1465

设g(i)表示正好有i封信装错信封

那么全部的C(n, i)*g(i)加起来正好就是所有装信的情况,总共n!(全排列)种情况

即:

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 typedef long long LL;
 5 LL fac[30];
 6 LL ans[30];
 7 LL c[30][30];
 8 int p[30];
 9 
10 void init()
11 {
12     c[1][0]=1;
13     c[1][1]=1;
14     p[0]=1;
15     p[1]=-1;
16     for(int i=2;i<=20;i++)
17     {
18         p[i]=p[i-1]*(-1);
19         
20         for(int j=0;j<=i;j++)
21         {
22             if(j==0||j==i)
23             c[i][j]=1;
24             else
25             c[i][j]=c[i-1][j-1]+c[i-1][j];
26         }
27     }
28     
29  } 
30  
31 int main()
32 {
33     init();
34     fac[0]=1;
35     fac[1]=1;
36     for(int i=2;i<=20;i++)
37     fac[i]=i*fac[i-1];
38     for(int i=1;i<=20;i++)
39     {
40         ans[i]=0;
41         for(int j=0;j<=i;j++)
42         {
43             ans[i]+=fac[j]*p[i-j]*c[i][j];
44         }
45     }
46         
47     int n;
48     while(scanf("%d",&n)!=EOF)
49     {
50         printf("%I64d\n",ans[n]);
51     }
52  } 

 

posted @ 2017-10-13 17:50  东流vip  阅读(158)  评论(0编辑  收藏  举报