HDU4472 Count
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4472
动态规划, 记忆化搜索。
设此时总节点数位n,则余下的节点总数为k = n - 1,因为同一级节点的子节点数要相同,只需对k的所有因子进行子结构搜索。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 const int mod = 1000000007; 5 const int maxn = 1000 + 2; 6 7 int f[maxn]; 8 9 int cal(int n) 10 { 11 if(f[n] != -1) 12 return f[n]; 13 int ans = 0, i; 14 ans += cal(n - 1); 15 int k = n - 1; 16 for(i = 2; i < n; i ++) 17 { 18 if(k % i == 0) 19 ans += cal(k - k / i * (i - 1)); 20 } 21 return ans; 22 } 23 24 void init() 25 { 26 memset(f, -1, sizeof f); 27 f[0] = 0, f[1] = 1, f[2] = 1; 28 for(int i = 3; i < maxn; i ++) 29 f[i] = cal(i) % mod; 30 } 31 32 int main() 33 { 34 int n, cas = 1; 35 init(); 36 while(scanf("%d", &n) == 1) 37 { 38 printf("Case %d: %d\n", cas++, f[n]); 39 } 40 return 0; 41 }