生成函数入门

HDU1028 Ignatius and the Princess III

代码

 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 }
View Code

 HDU 1398 Square Coins

 代码

 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 }
View Code

HDU 1085 Holding Bin-Laden Captive!

代码

 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 }
View Code

HDU 2079 选课时间(题目已修改,注意读题)

代码

 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 }
View Code

HDU 2082 找单词

代码

 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 }
View Code

HDU 1521 排列组合

代码

 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 }
View Code

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})$

代码

 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 }
View Code

POJ 3714 Blocks

同上

代码:

 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 }
View Code

----

猜你喜欢

转载自www.cnblogs.com/mjtcn/p/8971889.html