快速幂——序列求和(费马小定理求逆元)
题目描述
定义S(n) = 12 + 22 + … + n2,输出S(n) % 1000000007。
注意:1 < n < 1e18。
输入描述
多组输入,输入直到遇到EOF为止;
第一行输入一个正整数n。
输出描述
输出S(n) % 1000000007的结果。
示例
输入
1
2
1000
输出
1
5
333833500
分析
平方和公式为:
然后根据费马小定理,可以把式子变为:
其中 p 为质数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n;
ll quickpow(ll b,ll p)
{
ll result=1;
while(p){
if(p&1){
result=(result*b)%mod;
}
p>>=1;
b=(b*b)%mod;
}
return result;
}
int main()
{
while(cin>>n){
n%=mod;
ll s=(n*(n+1)%mod*(2*n+1)%mod)%mod;
s=s*quickpow(6,mod-2)%mod;
cout<<s<<endl;
}
return 0;
}