对于LZ提出的问题是该公式在矩形队伍排列的一个特例,具体结果我就不贴了。 BeerRabbit 发表于 2020-10-29 23:16
关键词:Hook Formula(钩子公式)
对于LZ提出的问题是该公式在矩形队伍排列的一个特例,具体结果我就不贴 ...
感谢解惑。 本帖最后由 aimisiyou 于 2020-10-30 09:46 编辑
对于一个有效格子A_i,其上面的有效格子数为Up_i,其右边的有效格子数为Right_i
则答案为Ans=n!/((Up_1 + Right_1 +1)*(Up_2 + Right_2 +1)*....*(Up_n + Right_n +1))
即结果为24!/(10*9*8*7*6*5*4*3)/(9*8*7*6*5*4*3*2)/(8*7*6*5*4*3*2*1)=23371634 本帖最后由 aimisiyou 于 2020-11-1 14:50 编辑
关于编码的描述可以理解,但“从右上角开始填起”,是怎么用编码来表示一个完整的填充过程?或者应是从右下角开始填充? #include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long int ll;
ll fac,n,m,T;
void init()
{
fac=1;
for(int i=1;i<=33333333;++i)
fac=fac*i%mod;
}
ll qpow(ll x,ll y)
{
ll ans=1,base=x;
while(y)
{
if(y&1)
ans=ans*base%mod;
base=base*base%mod;
y>>=1;
}
return ans;
}
inline ll C(int x,int y)
{
return fac*qpow(fac,mod-2)%mod*qpow(fac,mod-2)%mod;
}
inline ll get(ll n,ll m)
{
ll ans=1,sum=1;
for(int i=1;i<=n;++i)
{
ans=ans*fac%mod;
sum=sum*fac%mod;
// for(int j=1;j<=m;++j)
// ans=ans*(i+j-1)%mod;
}
return fac*qpow(ans,mod-2)%mod*sum%mod;
}
int main()
{
ios::sync_with_stdio(false);
init();
cin>>T;
while(T--)
{
cin>>n>>m;
if(n*m%3!=0)
{
cout<<0<<endl;
continue;
}
if(n%3!=0)
swap(n,m);
int base0=m/3;
int left0=base0,left1=base0+(m%3>0),left2=base0+(m%3>1);
ll ans=get(n/3,left0)*get(n/3,left1)%mod*get(n/3,left2)%mod;
ans=ans*C((left0+left1+left2)*n/3,left0*n/3)%mod;
ans=ans*C((left1+left2)*n/3,left1*n/3)%mod;
cout<<ans<<endl;
}
return 0;
} 本帖最后由 aimisiyou 于 2020-11-1 16:02 编辑
当m=n=3时,程序运行结果为6.
当m=3,n=,4时,程序运行结果为12.
当m=n=6时,程序运行结果为277200。 3*3怎么会只有6种呢?光排好身高最低的四人就有8种。
123
4**
***
124
3**
***
12*
34*
***
12*
3**
4**
再加上对称4种方案 mathe 发表于 2020-11-4 07:00
3*3怎么会只有6种呢?光排好身高最低的四人就有8种。
123
4**
应该是他算错了吧,3*3是42才对。
mathe 发表于 2020-11-4 07:00
3*3怎么会只有6种呢?光排好身高最低的四人就有8种。
123
4**
3*3对应的不是前面的排队问题(9!/5*4*3*4*3*2*3*2*1=42),而是骨牌填充问题(3*3).
页:
1
[2]