题解 P5509 【派遣】
题面传送门。
由题意,对于每个士兵
由此可知每个士兵之间是独立的,不相互影响,则根据乘法原理,答案应为
大力展开,即
即
不妨将分子分母拆开来看:
-
分子:
\prod_{i=0}^{n-1}\prod_{j=0,ik+j\neq0}^{k-1}ij 即
(nk-1)! -
分母:Markdown 渲染好像不太行。。。
i/j 0 1 2 \cdots k-1 0 / 1 2 \cdots k-1 1 k-1 k-1+1 k-1+2 \cdots 2(k-1) 2 2(k-1) 2(k-1)+1 2(k-1)+2 \cdots 3(k-1) \cdots\ \cdots \cdots \cdots \cdots \cdots n-2 (n-2)(k-1) (n-2)(k-1)+1 (n-2)(k-1)+2 \cdots (n-1)(k-1) \ \ n-1\ \ \ \ (n-1)(k-1)\ \ \ \ (n-1)(k-1)+1\ \ \ \ (n-1)(k-1)+2\ \ \ \ \cdots\ \ \ \ n(k-1)\ \ 不难发现
1\sim n(k-1) 各出现了一次,且每一行的第一个数与上一行的最后一个数相等,即k-1, 2(k-1), \cdots, (n-1)(k-1) 多出现了一次。那么分母为
[n(k-1)]!\times \prod_{i=1}^{n-1}i(k-1) 即
(nk-n)!\times (k-1)^{n-1}\times (n-1)!
综上,可知答案为:
但是
求
抓住模数
将所有
则答案为
预处理
根据威尔逊定理
这样可以做到
代码:
ll cal(ll v){return v<mod?fc[v]:fc[v%mod]*((v/mod)&1?-1:1)%mod*cal(v/mod)%mod;}
接下来计算出分子和分母各含有多少个
-
-
- 当 $p\mid k-1$ 时,$p$ 的个数为 $n-1$,此时一定无解(即输出 $\tt{-1}$),读者自证不难。 - 当 $p\nmid k-1$ 时,$p$ 的个数为 $0$,此时一定有解,读者自证不难。
综上,特判掉
可以证明
那么,当
计算快速幂时根据费马小定理将质数
代码片段:
ll ksm(ll a,ll b){
ll s=1,m=a;
while(b){
if(b&1)s=s*m%mod;
m=m*m%mod,b>>=1;
} return s;
} ll inv(ll x){return ksm(x%mod,mod-2);}
ll t,n,k,fc[mod+5];
ll cal(ll v){return v<mod?fc[v]:fc[v%mod]*((v/mod)&1?-1:1)%mod*cal(v/mod)%mod;}
int main(){
cin>>t,fc[0]=1;
for(int i=1;i<mod;i++)fc[i]=fc[i-1]*i%mod;
while(t--){
n=read(),k=read();
if(n==1)pc('1');
else if((k-1)%mod==0)pc('-'),pc('1');
else{
ll l=n*k-n,r=n*k-1;
if(r/mod+r/mod/mod>l/mod+l/mod/mod+(n-1)/mod)pc('0');
else print(cal(r)*inv(cal(l))%mod*inv(ksm(k-1,(n-1)%(mod-1))*cal(n-1))%mod);
} pc('\n');
}
return flush(),0;
}