Mr Zz

导航

Ignatius and the Princess III

120 个数 求 莫个数 有多少种可能整数拆分和  和母函数有关 但是要是每次都调用母函数代码会把之前的也都求出来浪费很多时间。不能 ac , 超时。改成先求出120,在根据下标输出就行
 1 #include <iostream>
2 #include<cstring>
3 #include<stdio.h>
4 #include<stdlib.h>
5 using namespace std;
6 #define lmax 150
7 int c1[lmax],c2[lmax];
8 int main()
9 {
10 int n,i,j,k;
11 for (i=0;i<=120;i++)
12 {c1[i]=0; c2[i]=0; }
13 for (i=0;i<=120;i++) c1[i]=1;
14 for (i=2;i<=120;i++)
15 {
16 for (j=0;j<=120;j++)
17 for (k=0;k+j<=120;k+=i)
18 { c2[j+k]+=c1[j]; }
19 for (j=0;j<=120;j++)
20 {
21 c1[j]=c2[j];
22 c2[j]=0;
23 }
24 }
25 while (scanf("%d",&n)!=EOF)
26 {
27 printf("%d\n",c1[n]);
28 }
29 return 0;
30 }

代码解释 来自白白

首先对c1初始化,由第一个表达式(1+x+x2+..xn)初始化,把质量从0到n的所有砝码都初始化为1.

 i从2到n遍历,这里i就是指第i个表达式,上面给出的第二种母函数关系式里,每一个括号括起来的就是一个表达式。

j 从0到n遍历,这里j就是只一个表达式里第j个变量,比如在第二个表达式里:(1+x2+x4….)里,第j个就是x2*j.

 k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。

、把c2的值赋给c1,而把c2初始化为0,因为c2每次是从一个表达式中开始的

posted on 2011-10-09 19:57  Mr Zz  阅读(249)  评论(0)    收藏  举报