1 条题解

  • 0
    @ 2025-8-24 22:11:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Alex_Wei
    **

    搬运于2025-08-24 22:11:30,当前版本为作者最后更新于2020-11-22 12:19:09,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题面传送门


    由题意,对于每个士兵 ii,要么选,对答案产生 ai(xix)a_i(\frac{x}{i-x}) 倍的贡献,要么不选,对答案产生 11 倍的贡献。

    由此可知每个士兵之间是独立的,不相互影响,则根据乘法原理,答案应为

    i=1nk1(ai+1)\prod_{i=1}^{nk-1}(a_i+1)

    大力展开,即

    $$\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} $$

    不妨将分子分母拆开来看:

    • 分子:

      i=0n1j=0,ik+j0k1ij\prod_{i=0}^{n-1}\prod_{j=0,ik+j\neq0}^{k-1}ij

      (nk1)!(nk-1)!
    • 分母:Markdown 渲染好像不太行。。。

      |i/ji/j|00|11|22|\cdots|k1k-1 |:-:|:-:|:-:|:-:|:-:|:-:|:-:| |00|/|11|22|\cdots|k1k-1 |11|k1k-1|k1+1k-1+1|k1+2k-1+2|\cdots|2(k1)2(k-1) |22|2(k1)2(k-1)|2(k1)+12(k-1)+1|2(k1)+22(k-1)+2|\cdots|3(k1)3(k-1) | \cdots\ |\cdots|\cdots|\cdots|\cdots|\cdots| |n2n-2|(n2)(k1)(n-2)(k-1)|(n2)(k1)+1(n-2)(k-1)+1|(n2)(k1)+2(n-2)(k-1)+2|\cdots|(n1)(k1)(n-1)(k-1) |  n1  \ \ n-1\ \ |  (n1)(k1)  \ \ (n-1)(k-1)\ \ |  (n1)(k1)+1  \ \ (n-1)(k-1)+1\ \ |  (n1)(k1)+2  \ \ (n-1)(k-1)+2\ \ |    \ \ \cdots\ \ |  n(k1)  \ \ n(k-1)\ \

      不难发现 1n(k1)1\sim n(k-1) 各出现了一次,且每一行的第一个数与上一行的最后一个数相等,即 k1,2(k1),,(n1)(k1)k-1, 2(k-1), \cdots, (n-1)(k-1) 多出现了一次。

      那么分母为

      [n(k1)]!×i=1n1i(k1)[n(k-1)]!\times \prod_{i=1}^{n-1}i(k-1)

      (nkn)!×(k1)n1×(n1)!(nk-n)!\times (k-1)^{n-1}\times (n-1)!

    综上,可知答案为:

    $$\dfrac{(nk-1)!}{(nk-n)!\times (k-1)^{n-1}\times (n-1)!} $$

    但是 nknk 已经达到了 101810^{18} 的数量级,怎么求这玩意的阶乘?


    v! (v>108)v!\ (v>10^8)p (p<108)p\ (p<10^8)

    抓住模数 p=1145141p=1145141,对 1v1\sim v 的每个数取模,最终会得到 vp\left\lfloor \dfrac{v}{p}\right\rfloor0p10\sim p-11(vmodp)1\sim (v\bmod p)

    将所有 pp 的倍数除以 pp,得到 vp\left\lfloor \dfrac{v}{p}\right\rfloor1p11\sim p-11(vmodp)1\sim (v\bmod p)1vp1\sim \left\lfloor \dfrac{v}{p}\right\rfloor

    则答案为

    $$(p-1)!^{\left\lfloor \frac{v}{p}\right\rfloor}\times (v\bmod p)!\times \left(\left\lfloor\frac{v}{p}\right\rfloor\right)! $$

    预处理 1p11\sim p-1 的阶乘,用递归 + 快速幂即可做到 O(logv)\mathcal O(\log v) 计算。

    根据威尔逊定理 (p1)!1 (mod p),pprime(p-1)!\equiv -1\ (\bmod\ p),p\in \rm{prime},原答案可化简为

    $$(-1)^{\left\lfloor \frac{v}{p}\right\rfloor}\times (v\bmod p)!\times \left(\left\lfloor\frac{v}{p}\right\rfloor\right)! $$

    这样可以做到 O(logpv)\mathcal O(\log_p v) 计算,可以近似看做常数。

    代码:

    ll cal(ll v){return v<mod?fc[v]:fc[v%mod]*((v/mod)&1?-1:1)%mod*cal(v/mod)%mod;}
    

    接下来计算出分子和分母各含有多少个 pp

    • v!v!:一般的,v!v! 中含有质因子 pp 的个数应为 $\sum_{i=1,v\geq p^i}\left\lfloor \dfrac{v}{p^i}\right\rfloor$,但此处 v<p3v<p^3,则可以化简为 $\left\lfloor \dfrac{v}{p}\right\rfloor+\left\lfloor \dfrac{v}{p^2}\right\rfloor$。
    • (k1)n1(k-1)^{n-1}
      • pk1p\mid k-1 时,pp 的个数为 n1n-1,此时一定无解(即输出 1\tt{-1}),读者自证不难。
      • pk1p\nmid k-1 时,pp 的个数为 00,此时一定有解,读者自证不难。

    综上,特判掉 pk1p\mid k-1 的情况,记 cc 为最终答案含有质因子 pp 的个数,则

    $$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 $$

    可以证明 c0c\geq 0

    那么,当 c>0c>0 时,ans0 (mod p)ans\equiv 0\ (\bmod\ p),输出 00 即可,否则计算上文推出的答案:

    $$\dfrac{(nk-1)!}{(nk-n)!\times (k-1)^{n-1}\times (n-1)!} $$

    计算快速幂时根据费马小定理将质数 n1n-1p1p-1,时间复杂度 O(p+tlogp)\mathcal O(p+t\log p)


    代码片段:

    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
    上传者