序列求和(逆元)

链接:登录—专业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的结果。

    这里的话我第一遍做的是直接跑,暴力求解肯定不对,但是数据小点说不定可以

    然后这个题主要的知识点是逆元的用法,加上高中学的一点前列项知识。、

   逆元的知识链接(我看过的最好理解的一篇):

  算法学习笔记(9):逆元 - 知乎 (zhihu.com)

    错误代码:

#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跑出来的程序结果是完全不同的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sky逆流而上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值