首页 > 其他 > 详细

数论--二项式反演

时间:2017-10-13 18:41:57      阅读:216      评论:0      收藏:0      [点我收藏+]

技术分享

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

 

应用:

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  } 

 

数论--二项式反演

原文:http://www.cnblogs.com/eastblue/p/7662357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!