nefu 519 昨日重现

本文介绍了一种高效计算公式f(n)=1^2+2^2+...+n^2对1007取余的方法,并给出了具体的C++实现代码。通过分析公式的化简形式及利用取余运算的性质,解决了大数运算可能导致的时间超限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨日重现


Problem : 519     Time Limit : 1000ms     Memory Limit : 65536K

description
兴安黑熊在高中学习数学时,曾经知道这样一个公式:f(n)=1^2+2^2+3^2+.......+n^2,这个公式是可以化简的,化简后的结果是啥它却忘记了,也许刚上大二的你能记得。现在的问题是想要计算f(n)对1007取余的值,你能帮帮他吗?

input
输入数据有多组,每组一个数n. (1<=n <=1,000,000,000).

output
输出f(n)对1007取余的值。

sample_input
3
4
100

sample_output
14
30
1005

hint
本题4分,容易超时

source

陈宇


分析:

1. 1^2+2^2+3^2+.......+n^2=1/6(n*(n+1)*(2n+1))

2. (a*b)%c=((a%c)*(b%c))%c    拓展:(a+b)%c=(a%c+b%c)%c

3. 因为 1^2+2^2+3^2+.......+n^2必为整数,所以1/6(n*(n+1)*(2n+1))也必为整数。

把1/6拆成1/2*1/3,易得a=n*(n+1)/2必为整数,如果a%3==0,则a=n*(n+1)/6,b=2n+1;否则,b=(2n+1)/3必为整数,即a=n*(n+1)/2,b=(2n+1)/3;然后运用第2条。


代码:

//听取陈老师建议;第一次写博客,有点小激动。。

#include <iostream>

using namespace std;

int main()
{
    long long a,ans,n;
    while(cin>>n)
    {
        a=(n*(n+1))/2;
        if(a%3==0) ans=(((a/3)%1007)*((2*n+1)%1007))%1007;
        else ans=((a%1007)*(((2*n+1)/3)%1007))%1007;
        cout<<ans<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值