题意是求这个:
那么化简一下:
左边
就可以用整除分块做法了
同理右边:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll powmod(ll a,ll b)
{
ll res=1;
for(;b;b>>=1)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
}
return res;
}
ll inv(ll x)
{
return powmod(x,mod-2);
}
ll getn2(ll n)
{
return n*(n+1)%mod*(2*n+1)%mod*inv(6)%mod;
}
ll getn3(ll n)
{
return ((n+1)*n%mod*(2+(n-1)*(n+2)%mod)%mod)%mod*powmod(4,mod-2)%mod;
}
ll caly(ll n)
{
ll ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ll tmp=(getn2(r)-getn2(l-1)+mod)%mod;
ans=(ans+tmp*(n/l)%mod)%mod;
}
return (n*n%mod*(n+1)%mod*inv(2)%mod-ans+mod)%mod;
}
ll calx(ll n)
{
ll ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ll tmp=(getn3(r)-getn3(l-1)+mod)%mod;
ans=(ans+tmp*(n/l)%mod)%mod;
}
return (n*getn2(n)%mod-ans+mod)%mod;
}
int main()
{
ll n,m;
cin>>n>>m;
ll ans1=calx(n);
ll ans2=caly(m);
printf("%lld\n",ans1*ans2%mod);
return 0;
}