1 条题解

  • 0
    @ 2025-8-24 23:14:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar weifengzhaomi
    加油,不要辜负对朱前泰说的话

    搬运于2025-08-24 23:14:37,当前版本为作者最后更新于2025-04-24 12:48:28,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题意 & 化简

    这道题要我们求,从 11 的阶乘一直加到 202320232023202320232023

    思路 1.0

    这道题数据非常大,所以我们考虑高精度,用 19981998 年普及组阶乘之和的做法,来写此题,数组开到 10810 ^ 8 差不多就够了。

    思路 2.0

    高精度也许能过此题,但是极其麻烦,甚至还有超时的风险,所以,我们要想一种方法来解决。

    首先,为了使计算量少,我们肯定希望 2255 越多越好,这样 00 就越多。

    于是,我们可以贪心一下,我们希望的是有一个数的阶乘,后面 99 位都是 00,而且,某个数后九位是 00,比他大的数的阶乘不会后九位不是 00。所以,我们只要先求出最小的、后九位是 00 数即可。

    在纸上求质因数发现,只要到 4040 的阶乘所产生的 00 就大于 99 了,因为 4040 的阶乘所相乘的每一个数字分解质因数后 2255严格大于等于 99 个。

    所以,我们可以枚举 113939,来记录阶乘的和,并且要在过程中取模 10910 ^ 9

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    long long ans,f = 1;
    const long long P = 1e9;
    int main(){
    	for (int i = 1;i <= 39;i++){
    		f = (f * i) % P;// 这里有个小技巧,每一个阶乘都是前一个乘i,这样还省了一个log时间复杂度。
    		ans += f;
    		ans %= P;
    	}
    	printf("%lld\n",ans);
    }
    

    思路 3.0

    这道题我们可以手算,只要不嫌麻烦,可以根据上面的思路来一步一步计算,只要不算错,就可以了,算出来取模 10910 ^ 9 的结果为 420940313420940313

    代码:

    #include<bits/stdc++.h>
    int main(){printf("420940313");}
    
    • 1

    信息

    ID
    12162
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者