链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题号:NC15950
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld题目描述
定义S(n) = 12 + 22 + … + n2,输出S(n) % 1000000007。
注意:1 < n < 1e18。
输入描述:
多组输入,输入直到遇到EOF为止; 第一行输入一个正整数n。输出描述:
输出S(n) % 1000000007的结果。
这里的话我第一遍做的是直接跑,暴力求解肯定不对,但是数据小点说不定可以
然后这个题主要的知识点是逆元的用法,加上高中学的一点前列项知识。、
逆元的知识链接(我看过的最好理解的一篇):
错误代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
int main()
{
ll n ,m;
while(cin>>n)
{
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=((i%mod)*(i%mod))%mod;
}
cout<<sum<<endl;
}
return 0;
}
逆元后的代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;//固定的mod
//一共有三种方法求逆元,我这里用的是快速幂求逆元;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans%mod*a%mod;
a=a%mod*a%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
ll n ,m;
while(cin>>n)
{
n=n%mod;
ll x=qpow(6,mod-2);
cout<<((n%mod*(n+1)%mod*(2*n+1)%mod)%mod*x%mod)%mod<<endl;
}
return 0;
}
这个题跑了很多次,错的原因很可能有 long long,然后就是每个数尽量都加上%mod;
可以测试:1e16,1e15,1e17这三个数据在些不加mod跑出来的程序结果是完全不同的。