[刷题#2][FJOI2015]建筑师

求1~n的全排列构成的建筑里里,有多少个排列,从左边看能看到a个,右边看能看到b个
一看数据范围( n50000 ,数据组数 t200000 ),觉得找规律
于是乎:

/*暴力找规律*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
const int mod=1000000007;
int vis[100010],ans,n,a,b,t[100010];
void dfs(int pos=0,int fa=0,int dep=0){
    vis[pos]=1;
    t[dep]=pos;
    if(dep==n){
        vis[pos]=0;
        int max=0,k=0;
        for(int i=1;i<=n;i++)
            max<t[i]?k++:1,max=std::max(max,t[i]);
        if(k!=a)return;
        max=0,k=0;
        for(int i=n;i;i--)
            max<t[i]?k++:1,max=std::max(max,t[i]);
        if(k!=b)return;
        ans++;
        return;
    }
    for(int i=1;i<=n;i++)
        if(!vis[i])dfs(i,pos,dep+1);
    vis[pos]=0;

}
int Test;
int main(){
    scanf("%d",&Test);
    if(Test==1)
        for(scanf("%d",&n),a=1;a<=n;a++)
            for(b=1;b<=n;b++)
                ans=0,dfs(),printf("(%d,%d) = %d%c",a,b,ans,"\t\n"[b==n]);
    else
        for(scanf("%d%d",&a,&b),n=1;n<=8;n++)
            ans=0,dfs(),printf("(%d) = %d\n",n,ans);
    main();
    //dfs();
}

当我发现每一斜线的比值都是杨辉三角形里的,但是放大多少倍我算不出来=-=,于是以自己并不好的数学开始推公式:
不会推,看来我的数学理论基础还是不够的,打算补补《具体数学》来看。
查看题解原来有个东西叫第一类斯特林数,所以这题等以后会的时候再来填坑吧>_<
T_T
发现自己好弱,没关系,趁着年轻,才初三,加油干

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值