1 条题解

  • 0
    @ 2025-8-24 22:16:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Alex_Wei
    **

    搬运于2025-08-24 22:16:49,当前版本为作者最后更新于2020-02-01 23:23:07,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    写篇小学生也能看懂的题解,不需要找规律。

    虽然看起来有一丢丢麻烦,但如果你认真读一定能看懂 ~

    Subtask 1\rm{Subtask\ 1} 无脑 Θ(n)\Theta(n) 预处理阶乘,再 Θ(n4)\Theta(n^4) 预处理 n[1,102]n\in[1,10^2] 的所有答案最后 Θ(1)\Theta(1) 回答询问即可。


    首先化简一下题目给出的柿子

    $$\sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^j\gcd(\frac{(i-j)!}{j!}\times j!,\frac{(j-k)!}{k!}\times k!) $$

    $$\sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^j\gcd((i-j)!,(j-k)!) $$

    $$\sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^j\min(i-j,j-k)! $$

    感觉题目直接给出上式就行了,学过数学的都会化简吧。

    但上面这坨柿子感觉不太可做的样子,看来是我太弱了.webp\rm{.webp}

    • 为了说明方便,在下文中我们定义 xxiji-jyyjkj-k

    i=1nj=1ik=1jmin(x,y)!\sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^j\min(x,y)!

    不难发现 x,yx,y 一定满足以下条件:

    • x,yx,y 为非负整数。(废话

    • x+yn1x+y\leq n-1

    于是乎,我们就知道 min(x,y)\min(x,y) 的最大值不会超过 n12\lfloor\frac{n-1}{2}\rfloor

    然后柿子就可以化简为这样:

    $$\sum_{a=0}^{\lfloor\frac{n-1}{2}\rfloor}a!\times z_a $$

    其中 zaz_a 为当 min(x,y)=a\min(x,y)=ai,j,ki,j,k 共有多少种取值,0an120\leq a\leq \lfloor\frac{n-1}{2}\rfloor

    是不是感觉可做了许多.jpeg\rm{.jpeg}


    我们考虑如何快速算出 zaz_a

    • 在此之前,我们先想想:如果我们确定了 x,yx,y,那么 i,j,ki,j,k 共有多少种取值。

      有一点是可以肯定的:一旦 x,yx,y 被确定,那么 i,j,ki,j,k 中的任意两个数也就相应地确定下来了。

      不妨设确定的两个数为 j,kj,k,用含 k,x,yk,x,y 的柿子表示 ii 就是 i=k+x+yi=k+x+y

      给定 in,k1i\leq n,k\ge 1 的限制,得 1knxy1\leq k\le n-x-y

      也就是说,如果 x,yx,y 确定,那么相应的 i,j,ki,j,k 共有 (nxy)1+1=nxy(n-x-y)-1+1=n-x-y 种取值。

    • 然后我们考虑当 min(x,y)=a\min(x,y)=ax,yx,y 有哪些情况。

      易想到为 x=a,y[a,na1]x=a,y\in[a,n-a-1]x[a,na1],y=ax\in[a,n-a-1],y=a

      注意到 x=a,y=ax=a,y=a 被包含在两种情况中,计算时要减去。

      很容易就可以算出 x=a,y[a,na1]x=a,y\in[a,n-a-1]i,j,ki,j,k 共有多少种取值:

      b=ana1nab\sum_{b=a}^{n-a-1}n-a-b

      化简得

      b=1n2ab\sum_{b=1}^{n-2a}b

      带入等差数列求和公式,即

      (1+n2a)×(n2a)2\frac{(1+n-2a)\times(n-2a)}{2}

      反之亦然,即 x,yx,y 交换顺序后取值数不变,所以

      za=2×(1+n2a)×(n2a)2(n2a)z_a=2\times\frac{(1+n-2a)\times(n-2a)}{2}-(n-2a)

      注意最后那个 n2an-2ax=a,y=ax=a,y=a 时重复计算的情况数。

      上式仍能化简,得

      $$\begin{aligned}z_a&=(1+n-2a)\times(n-2a)-(n-2a)\\&=(n-2a)+(n-2a)\times(n-2a)-(n-2a)\\&=(n-2a)^2\end{aligned} $$

    于是我们就能光速求出 zaz_a


    zaz_a 的公式带入原式,得

    $$\sum_{a=0}^{\lfloor\frac{n-1}{2}\rfloor}a!\times (n-2a)^2 $$

    这样我们就可以 Θ(n)\Theta(n) 求答案,可过 Subtask 2\rm{Subtask\ 2}


    这样好像还是不够快,怎么办?!

    好像没有能够 Θ(1)\Theta(1) 计算的方法啊.png\rm{.png}

    不慌,当然有:

    考虑把上式用完全平方公式拆开来,得

    $$\sum_{a=0}^{\lfloor\frac{n-1}{2}\rfloor}a!\times n^2-a!\times4a\times n+a!\times 4a^2 $$

    然后 Θ(n)\Theta(n) 预处理出 a!a!a!×4aa!\times 4aa!×4a2a!\times 4a^2 的前缀和,就可以做到 Θ(1)\Theta(1) 计算了,可过 Subtask 3\rm{Subtask\ 3}


    附上不长的代码。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+5,mod=10086001;
    long long frc[N],pre1[N],pre2[N],pre3[N],ans[N],n,t,q,u;
    int main(){
    	frc[0]=pre1[0]=1;
    	for(int i=1;i<N>>1;i++){
    		frc[i]=(frc[i-1]*i)%mod;
    		pre1[i]=(pre1[i-1]+frc[i])%mod;
    		pre2[i]=(pre2[i-1]+frc[i]*4*i)%mod;
    		pre3[i]=(pre3[i-1]+frc[i]*4*i%mod*i)%mod;
    	}//预处理部分
    	scanf("%lld",&t);
    	while(t--){
    		scanf("%lld",&q);
    		u=(q-1)/2;
    		printf("%lld\n",((pre1[u]*q%mod*q-pre2[u]*q+pre3[u])%mod+mod)%mod);
    	}//计算询问部分
    	return 0; 
    }
    

    如果发现笔误或学术上的错误,请在右侧评论区指出或直接私信我 qwq。

    完结撒花 ~ 码字不易,点个赞呗 awa。

    Upd on 2020.2.2\rm{Upd\ on\ 2020.2.2} 修改一处笔误。

    • 1

    信息

    ID
    4921
    时间
    500ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者