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

传送门


题目大意:
给出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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值