1 条题解

  • 0
    @ 2025-8-24 22:48:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Y_B_X
    ...

    搬运于2025-08-24 22:48:57,当前版本为作者最后更新于2023-08-09 18:18:48,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    原题链接

    题意:求满足 $\sum\limits_{k=0}^{n-1}\prod\limits_{j=0}^{m-1}a_{(k+j)\bmod n}=k,\forall_{i\in[0,n)}\ a_{i}=\pm 1$ 的 aa 的数量。
    n,m5×106n,m\leq 5\times 10^6

    为方便考虑,以下下标均自动对 nn 取模,\oplus 指异或,\bigoplus 指异或和。

    重新设 Ai ⁣= ⁣0/1A_{i}\!=\!0/1,并将限制条件改为 $\sum\limits_{k=0}^{n-1}(-1)^{\bigoplus \limits_{0\leq j<m}A_{k+j}}=k$。

    首先考虑 m=1m=1 怎么做,此时 k=0n1(1)Ai=k\sum\limits_{k=0}^{n-1}(-1)^{A_i}=k,设 Ai=1A_i=1ii 的个数为 pp,则有 p+np=k-p+n-p=k,所以 p=nk2p=\frac{n-k}{2}nkn-k 不是偶数时答案必为 00)。那这时答案显然为 (np)\binom{n}{p}

    对于一般情况,设 Bi=0j<mAi+jB_i=\bigoplus \limits_{0\leq j<m}A_{i+j},则 BiB_i11 的个数有 p=nk2p=\frac{n-k}{2} 个,即 0i<nBi=p\sum\limits_{0\leq i<n}B_i=p

    考虑统计 BB 的个数,而 BBAA 确定,那接下来要重点做的是便是:
    1.1. 找到每个 BB 能对应的 AA 的数量。
    2.2. 找到关系 Bi=0j<mAi+jB_i=\bigoplus \limits_{0\leq j<m}A_{i+j} 中蕴含的 BB 的限制条件。

    Step 1:\text{Step 1}: AABB 的对应关系

    假设我们已经有了一个序列 BB,考虑如何生成所有满足条件的 AA

    由于 AiAi+m=BiBi+1A_i\oplus A_{i+m}=B_i \oplus B_{i+1},等号右边是确定的,所以当 AiA_i 确定时直接可以推出 Ai+m,Ai+2mA_{i+m},A_{i+2m}\cdots。他们间的关系组成了一个长度为 ngcd(n,m)\frac{n}{\gcd(n,m)} 的环,而一共有个 gcd(n,m)\gcd(n,m) 个环。

    d=gcd(n,m)d=\gcd(n,m),则我们只需确定 A0,A1Ad1A_0,A_1\cdots A_{d-1} 就能得出全部数。

    Bi=0j<mAi+jB_i=\bigoplus \limits_{0\leq j<m}A_{i+j} 等价于 AiAi+m=BiBi+1A_i\oplus A_{i+m}=B_i \oplus B_{i+1} 并且 B0=i=0m1AiB_0=\bigoplus \limits_{i=0}^{m-1}A_i。接下来着重看第二个等式。

    由于相差 dd 的倍数的下标之间的关系已经明确,所以 B0=0j<mAjB_{0}=\bigoplus \limits_{0\leq j<m}A_{j} 本质上是 B0B_0 等于 m/dm/dA0A1Ad1A_0\oplus A_1\oplus \cdots \oplus A_{d-1} 相异或,再异或上一个已知的数

    m/dm/d 是偶数时,A0,A1Ad1A_0,A_1\cdots A_{d-1} 分别出现偶数次,都自己跟自己异或没了,不再有对他们间的限制,方案数为 2d2^d
    m/dm/d 是奇数时,A0A1Ad1A_0\oplus A_1\oplus \cdots \oplus A_{d-1} 会将明确等于一个数 0/10/1。由于在所有情况下,所有数异或起来等于 00 和等于 11 的方案数相同(改变一个数则一一对应),方案数为 2d12^{d-1}

    所以每个 BB 会对应 2d[m/dodd]2^{d-[m/d\in \mathrm{odd}]}AA

    Step 2:\text{Step 2}: BB 的限制条件

    对于一个环,相邻两个 AA 间的限制条件是 AiAi+m=BiBi+1A_i\oplus A_{i+m}=B_i \oplus B_{i+1}。但由于这是一个环,将所有这样的关系异或起来后,等号左边的 AA 会变成 00(每个数出现两次),所以 $B_{i}\oplus B_{i+1}\oplus B_{i+m}\oplus B_{i+1+m}\oplus \cdots=0$。

    Ci=j=0n/d1Bi+jdC_i=\bigoplus \limits_{j=0}^{n/d-1}B_{i+jd},即一个环上所有 BB 的异或和,上面说的就是对所有 ii 都有 CiCi+1=0 C_{i}\oplus C_{i+1}=0,所以 Ci=Ci+1C_i=C_{i+1}。于是所有的 CiC_i 要么全部等于 00,要么全部等于 11。也就是说每个环上 BB 的和要么全是奇数,要么全是偶数

    还不止这一限制,依然重新考虑 B0=i=0d1AiB_{0}=\bigoplus \limits_{i=0}^{d-1}A_i

    根据之前的讨论,当 m/dm/d 是偶数时,AA 全消掉了,事实上我们能推导出 CiC_{i} 必定是 00Step 1\text{Step 1} 的第二张图红字等价于 B0B2B4=0B_0\oplus B_{2}\oplus B_{4}=0)。(m/dm/d 是奇数时肯定不会有限制,因为和 AA 有关。)

    证明如下:

    由于 m/dm/d 是偶数,dm/2d|m/2,所以对任意的 iiiii+m/2i+m/2 在同一个环内。

    为构建 AiA_{i}Ai+m/2A_{i+m/2} 间的关系,设 SiS_i 代表从 ii 开始,每次将下标 +m+m 并对 nn 取模,直到下标为 i+m/2i+m/2,此过程中遍历到的下标上(包括 ii包括 i+m/2i+m/2)所有 BB 的异或和,那么就有 AiAi+m/2=SiSi+1A_i\oplus A_{i+m/2}=S_{i}\oplus S_{i+1}(不断由 AiAi+m=BiBi+1A_{i}\oplus A_{i+m}=B_{i}\oplus B_{i+1} 异或得来)。

    所以 $B_{0}=\bigoplus \limits_{0\leq i<m/2}A_i\oplus A_{i+m/2}=\bigoplus \limits_{0\leq i<m/2}S_{i}\oplus S_{i+1}=S_{0}\oplus S_{m/2}$。

    考虑一下 S0Sm/2S_{0}\oplus S_{m/2} 是什么,求 S0S_0 过程中遍历的最后一个下标 +m+m 就是 m/2m/2,而 Sm/2S_{m/2} 又以 00 结尾(0 ⁣+ ⁣m ⁣= ⁣m2 ⁣+ ⁣m20\!+\!m\!=\!\frac{m}{2}\!+\!\frac{m}{2}),所以这就是从 00 开始,不断将下标 +m+m,直到回到 00 的所有下表标上对应 BB 的异或和,注意 00 出现了两次,那这就是 C0B0C_{0}\oplus B_{0}

    所以 B0=C0B0B_{0}=C_{0}\oplus B_{0},也就是 C0=0C_{0}=0,于是 C0,1d1=0C_{0,1\cdots d-1}=0

    Summary\text{Summary}

    t=n/dt=n/d,即一个环的长度。

    m/dm/d 是偶数时,每个环上都只能有偶数个 BB11BB 一共要有 pp11,每个 BB 对应 2d2^dAA,所以答案是:

    $$2^d[x^p]\left(\sum_{2|i}\binom{t}{i}x^i\right)^d=[x^p]\left((1+x)^{t}+(1-x)^{t}\right)^d $$

    m/dm/d 是奇数时,每个环上 BB 的和的奇偶性相同,每个 BB 对应 2d12^{d-1}AA,答案是:

    $$2^{d-1}[x^p]\left(\sum_{2|i}\binom{t}{i}x^i\right)^d+\left(\sum_{2|i+1}\binom{t}{i}x^i\right)^d=[x^p]\dfrac{\left((1+x)^{t}+(1-x)^{t}\right)^d+\left((1+x)^{t}-(1-x)^{t}\right)^d}{2} $$

    直接 Ln+Exp\text{Ln}+\text{Exp} 求多项式 dd 次幂,O(nlogn)O(n\log n) 巨大常数显然过不了。

    把他们俩展开,分别有 $\begin{cases}\displaystyle \sum_{i}\binom{d}{i}\sum_{k}\binom{ti}{k}\binom{t(d-i)}{p-k}(-1)^k,m/d\in \mathrm{even}\\\displaystyle \sum_{2|i}\binom{d}{i}\sum_{k}\binom{ti}{k}\binom{t(d-i)}{p-k}(-1)^k,m/d\in \mathrm{odd}\end{cases}$,于是有了 O(pd)O(pd) 的做法,也不太行。

    (这部分解法是参考了题解区的)但由于已经有了封闭形式,多项式的次数不超过 nn,按着 FFT\text{FFT} 的方法,将 nn 补成 22 的幂 NN 后,对于点值 ωNk\omega_{N}^k 可以直接快速幂算,单次复杂度 O(logt+logd=logn)O(\log t+\log d=\log n),而需要的只有一项的系数,可以将点值直接乘上 IDFT\text{IDFT} 时的贡献系数得到。

    一个小优化:998244353=1+7×17×223998244353=1+7\times 17\times 2^{23},所以不一定 NN 硬要是 22 的幂,还可以是 77 或者 17,11917,119 乘上 22 的某次幂。

    这样复杂度是 O(nlogn)O(n\log n) 的,代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=5e6+10;
    const int mod=998244353;
    int n,m,p,a,b,ans,nn;
    int fac[N],ifac[N];
    #define sub(x,y) x<y?x-y+mod:x-y
    inline int qpow(int x,int k){
    	int res=1;
    	while(k){
    		if(k&1)res=1ll*res*x%mod;
    		x=1ll*x*x%mod;k>>=1; 
    	}
    	return res;
    }
    void work(){
    	int N1=1;while(N1<=n)N1<<=1;
    	int N2=7;while(N2<=n)N2<<=1;
    	int N3=17;while(N3<=n)N3<<=1;
    	int N4=119;while(N4<=n)N4<<=1;
    	int N=min({N1,N2,N3,N4});
    	p=N-p;
    	int i,w=qpow(3,(mod-1)/N),wp=qpow(w,p),v=1,vp=1,x,y;
    	if((m/b)&1){
    		for(i=0;i<N;++i,v=1ll*v*w%mod,vp=1ll*vp*wp%mod){
    			x=qpow(1+v,a);y=qpow(mod+1-v,a);
    			ans=(1ll*(qpow(x+y,b)+qpow(sub(x,y),b))*vp+ans)%mod;
    		}
    		ans=1ll*ans*qpow(N,mod-2)%mod;
    		ans=ans&1?ans+mod>>1:ans>>1;
    	}
    	else {
    		for(i=0;i<N;++i,v=1ll*v*w%mod,vp=1ll*vp*wp%mod){
    			x=qpow(1+v,a);y=qpow(mod+1-v,a);
    			ans=(1ll*qpow(x+y,b)*vp+ans)%mod;
    		}
    		ans=1ll*ans*qpow(N,mod-2)%mod;
    	}
    }
    void main_(){
    	cin>>n>>m>>p;ans=0;
    	if((n-p)&1)return puts("0"),void();
    	p=(n-p)>>1;
    	b=__gcd(n,m);a=n/b;
    	work();
    	cout<<ans<<'\n';
    }
    int main(){
    	int T;cin>>T;
    	while(T--)main_();
    } 
    

    还没结束,这题实际上能 O(n)O(n),且不依赖于 NTT\text{NTT} 模数。

    回到答案的展开式,后面的求和都是 $\displaystyle \sum_{k}\binom{ti}{k}\binom{t(d-i)}{p-k}(-1)^k$,其中 idi\leq d,所以 tinti\leq n

    于是只需求出所有的 $f_i=\displaystyle \sum_{k}\binom{i}{k}\binom{n-i}{p-k}(-1)^k,0\leq i\leq n$。

    这很像范德蒙德卷积,却偏偏多了一个 (1)k(-1)^k,像 ConcreteMathematics,A=B\mathcal{Concrete Mathematics},\mathcal{A=B} 等著作也没见着他的影。

    但他还是能递推的,可以手搓 Zeilberger’s Algorithm\text{Zeilberger's Algorithm} 得到答案:

    $$f_{i+1}=\dfrac{1}{n-i}\left(V f_{i}-Uf_{i-1}i\right) $$U=2+3n+n23p2np+p2(np)2+3(np)+2U=\dfrac{2+3n+n^2-3p-2np+p^2}{(n-p)^2+3(n-p)+2} $$V=\dfrac{2n+3n^2+n^3-4p-9np-4n^2p+6p^2+5mp^2-2p^3}{(n-p)^2+3(n-p)+2} $$

    我真的不信这玩意能有组合意义。

    推导过程过于复杂,由于篇幅限制就不再展开,有兴趣的看这里

    由于 x2+3x+20(modmod)x^2+3x+2\equiv 0\pmod {mod} 的解集只能是 {mod1,mod2}\{mod-1,mod-2\}npn-p 完全没有那么大,所以不用担心分母为 00

    代码没必要放了吧,就一个递推式的事。

    \text{}

    \text{}

    \text{}

    \text{}

    最优解到底是怎么回事呢?

    • 1

    信息

    ID
    8251
    时间
    3000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者