题目描述
GG有一个偶像,他叫高斯。没错,就是那个 不用循环语句就会计算1+2+3+4+…+100的小学生,GG对高斯简直是崇拜到了极点,最喜欢的定理是高斯定理,最喜欢的函数是高斯函数,最喜欢的人。。。,没错,阿翔你猜对了,GG最喜欢的人就是高斯欧巴啦!于是问题来了,GG也自己发明了一个函数f(x),f(x)是这样定义的f(x) = 1+2+3+…+x;是不是很简单啊! 不过如果你这样认为那你就小看GG啦!GG为了炫耀自己,他再发明了一个函数g(n),g(n)= f(1)+f(2)+ f(3)+…+f(n);
输入
T组数据,(T<=10000)每组一个整数n(n<=1000000)。
输出
对于每组数据,输出“Case #x:g(n) % mod”,x为第x组(mod = 1000000007);
样例输入
2
1
2
样例输出
Case #1: 1
Case #2: 4
来源
题解
解题过程
- 公式推导
- 由
g(1)=1,g(2)=4,g(3)=10,g(4)=10. - 知
g(n)-g(n-1)=(n+1)n/2=1/2(n+n^2)
……
g(3)-g(2)=6=1/2*(3+3^2)
g(2)-g(1)=3=1/2*(2+2^2) - 所以
g(n)-g(1)=1/2*((n-1)(n+2)/2)+n(n+1)*(2*n+1)/6 - 1)
g(n)=n*(n+1)/4+n*(n+1)*(2*n+1)/12 - 注:等差和公式和平方和公式 戳这<<
- 得到公式不能直接计算,因为对于除法取模要逆元法。详情 戳这<<
- 由
AC代码
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
LL pow_mod(LL a,LL b,LL p){//快速幂取模
LL ans=1,base=a;
while(b>0){
if(b&1) //n%2==1
ans=ans*base%p;
base=base*base%p;
b>>=1;// b/=2
}
return ans;
}
LL fermat(LL a,LL b)//费马
{
return pow_mod(a,b-2,b);
}
int main()
{
int T;
scanf("%d",&T);
LL inv4=fermat(4,mod);//预处理逆元4和12
LL inv12=fermat(12,mod);
LL n;
for(int cas=1;cas<=T;++cas){
scanf("%lld",&n);
LL ans=(int)((double)n/4*(n+1)+(double)n/12*(n+1)*(2*n+1))%mod;
printf("Case #%d: %lld\n",cas,ans);
}
return 0;
}