生成函数入门
HDU1028 Ignatius and the Princess III
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 5 using namespace std; 6 7 int a[130],b[130]; 8 9 int main() { 10 int n; 11 while (~scanf("%d",&n)) { 12 for (int i=0; i<=n; ++i) { 13 a[i] = 1;b[i] = 0; 14 } 15 for (int i=2; i<=n; ++i) { 16 for (int j=0; j<=n; ++j) 17 for (int k=0; k+j<=n; k+=i) 18 b[j+k] += a[j]; 19 for (int j=0; j<=n; ++j) { 20 a[j] = b[j];b[j] = 0; 21 } 22 } 23 printf("%d\n",a[n]); 24 } 25 return 0; 26 }
HDU 1398 Square Coins
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 5 using namespace std; 6 7 int a[310],b[310]; 8 9 int main() { 10 int n; 11 while (~scanf("%d",&n) && n) { 12 for (int i=0; i<=n; ++i) { 13 a[i] = 1;b[i] = 0; 14 } 15 for (int i=2; i<=n; ++i) { 16 for (int j=0; j<=n; ++j) 17 for (int k=0; k+j<=n; k+=i*i) 18 b[j+k] += a[j]; 19 for (int j=0; j<=n; ++j) { 20 a[j] = b[j];b[j] = 0; 21 } 22 } 23 printf("%d\n",a[n]); 24 } 25 return 0; 26 }
HDU 1085 Holding Bin-Laden Captive!
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 5 using namespace std; 6 7 int a[100100],b[100100],c[10]; 8 9 int main() { 10 int n; 11 while (~scanf("%d%d%d",&c[1],&c[2],&c[5]) && c[1]+c[2]+c[5]) { 12 memset(a,0,sizeof(a)); 13 memset(b,0,sizeof(b)); 14 15 int n = 1*c[1]+2*c[2]+5*c[5]; 16 for (int i=0; i<=c[1]; ++i) a[i] = 1; 17 for (int j=0; j<=c[1]; ++j) 18 for (int k=0; k<=c[2]; ++k) 19 b[j+k*2] += a[j]; 20 for (int j=0; j<=c[1]+2*c[2]; ++j) { 21 a[j] = b[j];b[j] = 0; 22 } 23 for (int j=0; j<=c[1]+2*c[2]; ++j) 24 for (int k=0; k<=c[5]; ++k) 25 b[j+k*5] += a[j]; 26 bool f = true; // 判断是否可以把所有的数组成。 27 for (int i=0; i<=n; ++i) 28 if (!b[i]) {cout << i;f = false;break;} 29 if (f) cout << n+1; 30 puts(""); 31 } 32 return 0; 33 }
HDU 2079 选课时间(题目已修改,注意读题)
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 6 using namespace std; 7 8 int a[100],b[100],c[100],d[100]; 9 10 inline int read() { 11 int x = 0,f = 1;char ch = getchar(); 12 for (; !isdigit(ch); ch=getchar()) if(ch=='-') f=-1; 13 for (; isdigit(ch); ch=getchar()) x = x*10+ch-'0'; 14 return x * f; 15 } 16 17 int main() { 18 int T = read(),n,k; 19 while (T--) { 20 memset(a,0,sizeof(a)); 21 memset(b,0,sizeof(b)); 22 n = read(),k = read(); 23 for (int i=1; i<=k; ++i) 24 d[i] = read(),c[i] = read(); // d-学分,c-d学分的课的个数 25 for (int i=0; i<=c[1]; ++i) a[i*d[1]] = 1; 26 for (int i=2; i<=k; ++i) { 27 for (int j=0; j<=n; ++j) 28 for (int k=0; k<=c[i]; ++k) 29 b[j+k*d[i]] += a[j]; 30 for (int j=0; j<=n; ++j) 31 a[j] = b[j],b[j] = 0; 32 } 33 printf("%d\n",a[n]); 34 } 35 return 0; 36 }
HDU 2082 找单词
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 6 using namespace std; 7 8 int a[100],b[100],c[100]; 9 10 inline int read() { 11 int x = 0,f = 1;char ch = getchar(); 12 for (; !isdigit(ch); ch=getchar()) if(ch=='-') f=-1; 13 for (; isdigit(ch); ch=getchar()) x = x*10+ch-'0'; 14 return x * f; 15 } 16 17 int main() { 18 int T = read(),n,k; 19 while (T--) { 20 memset(a,0,sizeof(a)); 21 memset(b,0,sizeof(b)); 22 for (int i=1; i<=26; ++i) c[i] = read(); 23 for (int i=0; i<=c[1]; ++i) a[i] = 1; 24 for (int i=2; i<=26; ++i) { 25 for (int j=0; j<=50; ++j) 26 for (int k=0; k<=c[i]&&j+k*i<=50; ++k) 27 b[j+k*i] += a[j]; 28 for (int j=0; j<=50; ++j) 29 a[j] = b[j],b[j] = 0; 30 } 31 int ans = 0; 32 for (int i=1; i<=50; ++i) ans += a[i]; // 单词不能是空 33 printf("%d\n",ans); 34 } 35 return 0; 36 }
HDU 1521 排列组合
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 7 double a[100],b[100]; 8 int c[100],f[100]; 9 10 int main() { 11 int n,m; 12 f[0] = 1; 13 for (int i=1; i<=20; ++i) f[i] = f[i-1] * i; 14 while (scanf("%d%d",&n,&m) != EOF) { 15 memset(a,0,sizeof(a)); 16 memset(b,0,sizeof(b)); 17 for (int i=1; i<=n; ++i) scanf("%d",&c[i]); 18 for (int i=0; i<=c[1]; ++i) a[i] = 1/(double)f[i]; 19 for (int i=2; i<=n; ++i) { 20 for (int j=0; j<=m; ++j) 21 for (int k=0; k<=c[i]&&k+j<=m; ++k) 22 b[j+k] += a[j]/(double)f[k]; 23 for (int j=0; j<=m; ++j) 24 a[j] = b[j],b[j] = 0; 25 } 26 printf("%.0lf\n",1.0*f[m]*a[m]); 27 } 28 return 0; 29 }
HDU 2065 "红色病毒"
求:
$(1+x+\frac{x^2}{2!}+\frac{x^3}{3!}...)^2 (1+\frac{x^2}{2!}+\frac{x^4}{4!}+...)^2$
由:
$e^x = (1+x+\frac{x^2}{2!}+\frac{x^3}{3!}...)$
$e^{-x} = (1-x+\frac{x^2}{2!}-\frac{x^3}{3!}...)$
于是原式中后面的式子 = $\frac{1}{2}(e^x+e^{-x})$
原式$ = e^{2x}*(\frac{1}{2}(e^x+e^{-x}))^2$
$ = \frac{1}{4}(e^{4x}+2e^{2x}+1)$
$ = \frac{1}{4}(1+4x+\frac{(4x)^2}{2!}+\frac{(4x)^3}{3!}...+2+\frac{2x^2}{2!}+\frac{2x^4}{4!}+...+1)$
$ = \frac{1}{4}\sum\limits_{n}^{oo}(4^n+2*2^n)\frac{x^n}{n!}$
$a_n = \frac{1}{4}(4^n+2*2^n) = (4^{n-1}+2^{n-1})$
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 6 using namespace std; 7 8 typedef long long LL; 9 const LL mod = 100; 10 11 LL ksm(LL a,LL b) { 12 LL ans = 1; 13 while (b) { 14 if (b & 1) ans = (ans * a) % mod; 15 a = (a * a) % mod; 16 b >>= 1; 17 } 18 return ans; 19 } 20 int main() { 21 int T;LL n; 22 while (scanf("%d",&T)!=EOF && T) { 23 for (int i=1; i<=T; ++i) { 24 scanf("%lld",&n); 25 printf("Case %d: %lld\n",i,(ksm(2,n-1)+ksm(4,n-1))%mod); 26 } 27 puts(""); 28 } 29 return 0; 30 }
POJ 3714 Blocks
同上
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 6 using namespace std; 7 8 typedef long long LL; 9 const LL mod = 10007; 10 11 LL ksm(LL a,LL b) { 12 LL ans = 1; 13 while (b) { 14 if (b & 1) ans = (ans * a) % mod; 15 a = (a * a) % mod; 16 b >>= 1; 17 } 18 return ans; 19 } 20 int main() { 21 int T;LL n; 22 scanf("%d",&T); 23 for (int i=1; i<=T; ++i) { 24 scanf("%lld",&n); 25 printf("%lld\n",(ksm(2,n-1)+ksm(4,n-1))%mod); 26 } 27 28 return 0; 29 }
----