您的位置:首页 > 其它

POJ 2279 Mr. Young's Picture Permutations......杨氏矩阵+钩长公式??

2016-07-28 11:44 609 查看
传送门

题目大意:

给出n行,每行有人数限制num[i],并且num[i]>=num[i+1],总人数暂且称为tot=∑num[i],把1~tot这些数字填入矩阵,使得矩阵满足每行单调递增,每列单调递增,求满足要求的矩阵数目

分析:

额,伟大的杨氏矩阵和钩长公式告诉我们此题的解法:>_<

ans=tot!/sum[1]/sum[2]/sum[3]/……../sum[tot]

sum[i]=i号格子右边→_→的格子数+☟下边的格子数

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define int __int64
using namespace std;
const int maxn=30+5;
int num[maxn],sum[maxn*maxn],n,cnt,x,y,tmp;
inline int read(void){
char ch=getchar();
int f=1,x=0;
while(!(ch>='0'&&ch<='9')){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
x=x*10+ch-'0',ch=getchar();
return f*x;
}
int gcd(int a,int b){
return a%b==0 ? b : gcd(b,a%b);
}
signed main(void){
while(n=read()){
for(int i=1;i<=n;i++)
num[i]=read();
memset(sum,0,sizeof(sum)),cnt=0,x=1,y=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=num[i];j++){
cnt++;
for(int k=i+1;k<=n;k++){
if(num[k]>=j)
sum[cnt]++;
else
break;
}
sum[cnt]+=num[i]-j+1;
}
for(int i=1;i<=cnt;i++)
x*=i,y*=sum[i],tmp=gcd(x,y),x/=tmp,y/=tmp;
printf("%I64d\n",x/y);
}
return 0;
}


by >o< neighthorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: