您的位置:首页 > 其它

【2011 Greater New York Regional 】Problem H: Maximum in the Cycle of 1

2013-10-01 16:29 447 查看
也是一个数学题;

主要用到的是排列组合的知识,推推公式就行了,挺简单的;

唯一要注意的是A(0,0)=1;

在这个上面WA了几次,= =

代码:

#include<stdio.h>
#define ULL unsigned long long
#define maxn 21
using namespace std;

ULL C[maxn+5][maxn+5];//范围可向上变更
ULL A[maxn];
void builtC(){
memset(C,0,sizeof(C));
C[0][0]=1;
for(int i=1;i<=maxn;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<=i;j++){
C[i][j]=(C[i-1][j]+C[i-1][j-1]);
}
}
return ;
}
void builtA()
{
ULL a=1;
A[0]=1;
for(int i=1;i<=20;i++)
{
a=a*i;
A[i]=a;
}
}
int main()
{
builtC();
builtA();
int t;
while(~scanf("%d",&t))
{
int cas,n,k;
while(t--)
{
scanf("%d%d%d",&cas,&n,&k);
ULL ans=0;
if (k==1) {printf("%d %.0lf\n",cas,(double)A[n-1]);continue;}
int sc1=n-k,sc2=k-1,sc3=k-2;
while(sc1<=n-2)
{
ans+=A[sc1]*A[sc2]*C[k-2][sc3];
sc1++;sc2--;sc3--;
}
printf("%d %.0lf\n",cas,(double)ans);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐