1 条题解

  • 0
    @ 2025-8-24 22:07:54

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar love_luke
    躺平者,皇室战争玩家

    搬运于2025-08-24 22:07:54,当前版本为作者最后更新于2019-01-13 14:15:58,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    对HAY大佬的题解做一个进一步的解释(我觉得他没说清楚)

    首先,这道题的数据还是比较大的,感觉用long long也会爆,先不管,开成long long。然后读入r,半径是根号r,就开个方,存在lin里。

        long long r,i,sum=0,lin,a,b;
        scanf("%lld",&r);
        lin=sqrt(r);
    

    然后就到了精髓部分。其他题解都用了平方和公式,而我们不需要,使用远古算法,把每个平方的个数都求出来,然后乘起来,最后全部加起来。当然,我们只需要算一个象限加一个半轴的,最后再乘4就行了。

        for (i=1;i<=lin;++i)
        {
            a=sqrt(r-i*i);//当横坐标为i时,第一象限内最多有多少个
            a=(2*a+1)%1000000007;//把半轴和纵坐标为i的情况算上
            b=(i*i)%1000000007;//平方
            sum=(sum+a*b)%1000000007;//个数乘平方再累加
        }
        printf("%lld",(sum*4)%1000000007);//输出
    
    • 1

    信息

    ID
    4120
    时间
    1000ms
    内存
    16MiB
    难度
    4
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者