递推,考虑到一n可以由i * j + 1组合出来,即第二层有j个含有i个元素的子树。。。然后就可以了。。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<fstream> #include<sstream> #include<bitset> #include<vector> #include<string> #include<cstdio> #include<cmath> #include<stack> #include<queue> #include<stack> #include<map> #include<set> #define FF(i, a, b) for(int i=a; i<b; i++) #define FD(i, a, b) for(int i=a; i>=b; i--) #define REP(i, n) for(int i=0; i<n; i++) #define CLR(a, b) memset(a, b, sizeof(a)) #define debug puts("**debug**") #define LL long long #define PB push_back #define SL(a) strlen(a) using namespace std; const int N = 1111; const int MOD = 1e9 + 7; LL ans[N]; int main() { int n, cas = 1, i, j; CLR(ans, 0); ans[1] = 1; for(i = 1; i < N; i ++) { for(j = 1; i * j + 1 < N; j ++) { ans[j * i + 1] += ans[i]; ans[j * i + 1] %= MOD; } } while(cin >> n) { cout << "Case " << cas ++ << ": "; cout << ans[n] << endl; } }