hdu-1133,1131 依然Catalan数
2012-03-01 21:40
267 查看
俩题惊人的相似嗄 唉 有个打算把ACM Step的题挨个总结一下、、、、、稍后有时间了 写写吧
加油!吖飒~~~~~
http://acm.hdu.edu.cn/showproblem.php?pid=1133
本题依然是Catalan数。稍加变形而已。公式的推导结果为:C[i][j]=(i+j)*(i+1-j)/j/(i+2-j)*C[i][j-1];
http://acm.hdu.edu.cn/showproblem.php?pid=1131
还是Catalan数,公式:C[i][j]=(4n-2)/(n+1)*C[i][j-1]
1131Conut the tree的代码及解释:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int num[101][400];
int len[101];
void Catalan()
{
int i,j;
num[0][0]=1;
num[1][0]=1;
len[0]=1;
int flag;
for(i=2;i<101;i++)
{
//乘4n-2
int k=4*i-2;
flag=0;
for(j=0;j<=len[i-1];j++)
{
int z=flag+num[i-1][j]*k;
num[i][j]=z%10;
flag=z/10;
}
while(flag)
{
num[i][j++]=flag%10;
flag/=10;
}
len[i]=j;flag=0;
//除n+1
while(j>=0)
{
int w=num[i][j]+flag*10;
num[i][j]=w/(i+1);
flag=w%(i+1);
j--;
}
}
}
int fun()//在求的的Catalan数的基础上乘m的阶乘
{
int i,k,m;
for(m=1;m<101;m++)
{
for(i=1;i<=m;i++)
{
int flag=0;
for(k=0;k<len[m];k++)
{
int w=i*num[m][k]+flag;
num[m][k]=w%10;
flag=w/10;
}
while(flag)
{
num[m][k++]=flag%10;
flag/=10;
}
len[m]=k;
}
}
return 0;
}
int main()
{
Catalan();
fun();
int m;
len[1]=1;
int cnt=1;
while(cin>>m&&m)
{
int i=len[m]-1;
while(i>=0)
cout<<num[m][i--];
cout<<endl;
}
return 0;
}
1133Buy the ticket的代码及解释:
加油!吖飒~~~~~
http://acm.hdu.edu.cn/showproblem.php?pid=1133
本题依然是Catalan数。稍加变形而已。公式的推导结果为:C[i][j]=(i+j)*(i+1-j)/j/(i+2-j)*C[i][j-1];
http://acm.hdu.edu.cn/showproblem.php?pid=1131
还是Catalan数,公式:C[i][j]=(4n-2)/(n+1)*C[i][j-1]
1131Conut the tree的代码及解释:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int num[101][400];
int len[101];
void Catalan()
{
int i,j;
num[0][0]=1;
num[1][0]=1;
len[0]=1;
int flag;
for(i=2;i<101;i++)
{
//乘4n-2
int k=4*i-2;
flag=0;
for(j=0;j<=len[i-1];j++)
{
int z=flag+num[i-1][j]*k;
num[i][j]=z%10;
flag=z/10;
}
while(flag)
{
num[i][j++]=flag%10;
flag/=10;
}
len[i]=j;flag=0;
//除n+1
while(j>=0)
{
int w=num[i][j]+flag*10;
num[i][j]=w/(i+1);
flag=w%(i+1);
j--;
}
}
}
int fun()//在求的的Catalan数的基础上乘m的阶乘
{
int i,k,m;
for(m=1;m<101;m++)
{
for(i=1;i<=m;i++)
{
int flag=0;
for(k=0;k<len[m];k++)
{
int w=i*num[m][k]+flag;
num[m][k]=w%10;
flag=w/10;
}
while(flag)
{
num[m][k++]=flag%10;
flag/=10;
}
len[m]=k;
}
}
return 0;
}
int main()
{
Catalan();
fun();
int m;
len[1]=1;
int cnt=1;
while(cin>>m&&m)
{
int i=len[m]-1;
while(i>=0)
cout<<num[m][i--];
cout<<endl;
}
return 0;
}
1133Buy the ticket的代码及解释:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int C[101][101][400]; int len[101][101]; int Catalan() { memset(len,0,sizeof(len)); memset(C,0,sizeof(C)); int i,j,k; for(i=1;i<=100;i++) { C[i][0][0]=1; len[i][0]=1; //乘(i+j)*(i+1-j) for(j=1;j<=i;j++) { int flag=0; for(k=0;k<len[i][j-1];k++) { int w=(i+j)*(i+1-j)*C[i][j-1][k]+flag; C[i][j][k]=w%10; flag=w/10; } while(flag) { C[i][j][k++]=flag%10; flag/=10; } len[i][j]=k; //除j*(i+2-j) int z=j*(i+2-j); while(k>=0) { int y=C[i][j][k]+flag*10; C[i][j][k]=y/z; flag=y%z; k--; } } } return 0; } int fun()//在求的的Catalan数的基础上乘m的阶乘再乘n的阶乘 { int i,k,m,n; for(m=1;m<101;m++) { ///////////当n=0的时候 for(i=1;i<=m;i++) { int flag=0; for(k=0;k<len[m][0];k++) { int w=i*C[m][0][k]+flag; C[m][0][k]=w%10; flag=w/10; } while(flag) { C[m][0][k++]=flag%10; flag/=10; } len[m][0]=k; } for(n=1;n<=m;n++) { for(i=1;i<=m;i++) { int flag=0; for(k=0;k<len[m] ;k++) { int w=i*C[m] [k]+flag; C[m] [k]=w%10; flag=w/10; } while(flag) { C[m] [k++]=flag%10; flag/=10; } len[m] =k; } for(i=1;i<=n;i++) { int flag=0; for(k=0;k<len[m] ;k++) { int w=i*C[m] [k]+flag; C[m] [k]=w%10; flag=w/10; } while(flag) { C[m] [k++]=flag%10; flag/=10; } len[m] =k; } } } return 0; } int main() { Catalan(); fun(); int m,n; int cnt=1; while(cin>>m>>n&&(m+n)!=0) { printf("Test #%d:\n",cnt++); if(m<n) cout<<"0"<<endl; else { int i=len[m] -1; while(i>=0) cout<<C[m] [i--]; cout<<endl; } } return 0; }
相关文章推荐
- Catalan数 HDU 2067 HDU 1023 HDU 1131
- HDU-1133 Buy the Ticket (Catalan数)
- hdu 1133 Buy the Ticket(Catalan数)
- hdu 1131 Count the Trees(catalan数的应用)
- 【大数+DP】HDU 1133——Buy the tickets(不用catalan数了)
- hdu 1133
- hdu 1133 Buy the Ticket(卡特兰数 + 高精度)
- hdu 1133 Buy the Ticket
- hdu-1131 Count the trees
- hdu 1131
- hdu 1133 Buy the Ticket(大数运算)
- HDU 1131 Count the Trees 卡特兰数的应用
- hdu 1133 Buy the Ticket(递推+精度精算)
- hdu 1131 Count the Trees 卡特兰数+java
- Catalan数-hdu-3723-Delta Wave
- hdu 1134 Game of Connections (Catalan数)
- HDU 1133 - Buy the Ticket 【动态规划+组合 ~递推 偶遇 卡特兰】
- HDU 1133
- hdu 1131 Count the Trees 卡特兰数+java
- Buy the Ticket&&http://acm.hdu.edu.cn/showproblem.php?pid=1133