数学知识:乘法逆元

例如求 a1*a2*a3*...*an/b%mod 时,除法不能同时取模(既不能同时(a%mod) / (b%mod) ),这时可以通过乘法逆元来进行转换,既a/b\equiv a*x(mod),x为b的乘法逆元,因为a/b和a*x对mod取模的值一样,所以只需要计算(a%mod*x%mod)%mod即可

当编号是1^{2}+2^{2}+3^{2}+...+t^{2}操作后灯会亮着;

令t=sqrt(n);

所以ans=t*(t+1)*(2*t+1)/6%(1e9+7);

显然没有很好的办法直接求答案(用__int128也能直接求或者把6拆成2*3也行,不过个人感觉乘法逆元方法要好点)

这时就可以求6的乘法逆元来求答案;

#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;

const LL mod=1e9+7;

LL inv(int t)//求乘法逆元
{
	if(t==1)
		return 1;
	else
		return (mod-mod/t)*inv(mod%t)%mod;
}

int main()
{
	LL n;
	cin>>n;
	LL t=sqrt(n);
	LL ans=t%mod*(t+1)%mod*(2*t+1)%mod*inv(6)%mod;
	cout<<ans<<"\n";
	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值