求1~n的全排列构成的建筑里里,有多少个排列,从左边看能看到a个,右边看能看到b个
一看数据范围(
n≤50000
,数据组数
t≤200000
),觉得找规律
于是乎:
/*暴力找规律*/
#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
发现自己好弱,没关系,趁着年轻,才初三,加油干