您的位置:首页 > 其它

hdu 1133(卡特兰数)

2013-03-23 17:30 288 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133

卡特兰数的应用:( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简即 (m+n)! * (m-n+1) / (m+1)

string处理比较方便。。。

View Code

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
vector<string>vet;

string Mul(string &str,int n){
string s="";
int len=str.size();
int c=0,l=0;
for(int i=len-1;i>=0;i--){
c=l+(str[i]-'0')*n;
l=c/10;
s+=c%10+'0';
}
while(l){
s+=l%10+'0';
l=l/10;
}
reverse(s.begin(),s.end());
return s;
}

void Facs(){
vet.push_back("0");
vet.push_back("1");
vet.push_back("2");
string str="2";
for(int i=3;i<=204;i++){
str=Mul(str,i);
vet.push_back(str);
}
}

string Divide(string &str,int n){
string s="";
int len=str.size();
int c=0,l=0;
for(int i=0;i<=len-1;i++){
c=l*10+str[i]-'0';
l=c%n;
c=c/n;
if(c==0&&s.size()==0)continue;
else s+=c+'0';
}
return s;
}

int main(){
Facs();
int n,m;
int _case=1;
while(~scanf("%d%d",&m,&n)){
if(n==0&&m==0)break;
printf("Test #%d:\n",_case++);
if(m<n){
printf("0\n");
continue;
}
string str=vet[n+m];
str=Mul(str,m-n+1);
str=Divide(str,m+1);
cout<<str<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: