例如求 a1*a2*a3*...*an/b%mod 时,除法不能同时取模(既不能同时(a%mod) / (b%mod) ),这时可以通过乘法逆元来进行转换,既,x为b的乘法逆元,因为a/b和a*x对mod取模的值一样,所以只需要计算(a%mod*x%mod)%mod即可
当编号是操作后灯会亮着;
令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;
}