昨日重现
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;
}