1 条题解
-
0
自动搬运
来自洛谷,原作者为

Alex_Wei
**搬运于
2025-08-24 22:11:30,当前版本为作者最后更新于2020-11-22 12:19:09,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
由题意,对于每个士兵 ,要么选,对答案产生 倍的贡献,要么不选,对答案产生 倍的贡献。
由此可知每个士兵之间是独立的,不相互影响,则根据乘法原理,答案应为
大力展开,即
$$\prod_{i=0}^{n-1}\prod_{j=0,ik+j\neq0}^{k-1}\left(\frac{i}{ik+j-i}+1\right) $$即
$$\prod_{i=0}^{n-1}\prod_{j=0,ik+j\neq0}^{k-1}\frac{ik+j}{ik+j-i} $$不妨将分子分母拆开来看:
-
分子:
即
-
分母:Markdown 渲染好像不太行。。。
|||||| |:-:|:-:|:-:|:-:|:-:|:-:|:-:| ||/|||| |||||| |||||| ||||||| |||||| ||||||
不难发现 各出现了一次,且每一行的第一个数与上一行的最后一个数相等,即 多出现了一次。
那么分母为
即
综上,可知答案为:
$$\dfrac{(nk-1)!}{(nk-n)!\times (k-1)^{n-1}\times (n-1)!} $$但是 已经达到了 的数量级,怎么求这玩意的阶乘?
求 模 :
抓住模数 ,对 的每个数取模,最终会得到 个 和 。
将所有 的倍数除以 ,得到 个 和 和 。
则答案为
$$(p-1)!^{\left\lfloor \frac{v}{p}\right\rfloor}\times (v\bmod p)!\times \left(\left\lfloor\frac{v}{p}\right\rfloor\right)! $$预处理 的阶乘,用递归 + 快速幂即可做到 计算。
根据威尔逊定理 ,原答案可化简为
$$(-1)^{\left\lfloor \frac{v}{p}\right\rfloor}\times (v\bmod p)!\times \left(\left\lfloor\frac{v}{p}\right\rfloor\right)! $$这样可以做到 计算,可以近似看做常数。
代码:
ll cal(ll v){return v<mod?fc[v]:fc[v%mod]*((v/mod)&1?-1:1)%mod*cal(v/mod)%mod;}
接下来计算出分子和分母各含有多少个 :
- :一般的, 中含有质因子 的个数应为 $\sum_{i=1,v\geq p^i}\left\lfloor \dfrac{v}{p^i}\right\rfloor$,但此处 ,则可以化简为 $\left\lfloor \dfrac{v}{p}\right\rfloor+\left\lfloor \dfrac{v}{p^2}\right\rfloor$。
- :
- 当 时, 的个数为 ,此时一定无解(即输出 ),读者自证不难。
- 当 时, 的个数为 ,此时一定有解,读者自证不难。
综上,特判掉 的情况,记 为最终答案含有质因子 的个数,则
$$c=\left\lfloor \dfrac{nk-1}{p}\right\rfloor+\left\lfloor \dfrac{nk-1}{p^2}\right\rfloor-\left(\left\lfloor \dfrac{nk-k}{p}\right\rfloor+\left\lfloor \dfrac{nk-k}{p^2}\right\rfloor\right)-\left\lfloor \dfrac{n}{p}\right\rfloor $$可以证明 。
那么,当 时,,输出 即可,否则计算上文推出的答案:
$$\dfrac{(nk-1)!}{(nk-n)!\times (k-1)^{n-1}\times (n-1)!} $$计算快速幂时根据费马小定理将质数 模 ,时间复杂度 。
代码片段:
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; } -
- 1
信息
- ID
- 4469
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者