第一注意整数溢出的情况
第二,递归函数的含义要非常的明确,这样才能真正明白它的含义,以及确定出边界条件
第三,如果一个指令有可能不执行,那么要放到循环体的里面去
下面是代码
#include<iostream> #include<string> using namespace std; typedef unsigned __int64 ULL; ULL cnt = 1; string pre,post; int K; //k叉树 //i的阶乘 ULL F(int i) { ULL mul = 1; while(i) { mul = mul * i; i--; } return mul; } ULL C_K_I(int i) { if(i == 0) return 1; return F(K) / (F(i) * F(K - i));//很重要 } void compute(int s_pre,int e_pre,int s_post,int e_post) { int level_cnt = 0; int c_pre_s = s_pre + 1; int c_post_s = s_post; int c_post_e,c_pre_e; //关于顺序 //如果某一个指令不一定能够执行,那么一定要把它放到while中去 while(c_pre_s <= e_pre) { c_post_e = post.find(pre[c_pre_s]); c_pre_e = c_pre_s + c_post_e - c_post_s; compute(c_pre_s,c_pre_e,c_post_s,c_post_e); level_cnt++; c_pre_s = c_pre_e + 1; c_post_s = c_post_e + 1; } cnt = cnt * C_K_I(level_cnt); } int main() { //K = 13; freopen("input.txt","r",stdin); cin>>K; cin>>pre>>post; compute(0,pre.size() - 1,0,post.size() - 1); //printf("%ld",C_K_I(2)); return 0; }