链接
http://www.lydsy.com/JudgeOnline/problem.php?id=2956
题解
这题难点在第一步,第一步想到后面就一路畅通了 先不考虑
i≠j
这个条件
∑i=1n∑j=1m(n mod i)(m mod j) =∑i=1n∑j=1m(n−⌊ni⌋)(m−⌊mj⌋)
然后再减去
i=j
的情况(公式略)
画出柿子来搞一搞就好了。
博主真是懒
代码
//画柿子题
using namespace std;
ll n,
m, ans, tmp;
inline ll sum(ll a, ll b){
return ((a+b)
*(b-a+
1)>>
1)
%mod;}
inline ll suan(ll
x)
{
if(
x*(x+
1)
%3==
0)
return x*(x+
1)/
6%mod*(2*x+
1)
%mod;
else return x*(x+
1)/
2%mod*(2*x+
1)/
3%mod;
}
inline ll sum2(ll a, ll b){
return (suan(b)-suan(a-
1))
%mod;}
int main()
{
ll i,
last;
scanf(
"%lld%lld",&n,&
m);
if(n>
m)swap(n,
m);
for(i=
1;i<=
m;i=
last+
1)
{
last=
m/(m/i);
tmp=(tmp+
m*(last-i+
1)-
m/i*sum(i,last))%mod;
}
for(i=1;i<=n;i=last+1)
{
last=n/(n/i);
ans=(ans+(n
*(last-i+
1)-n/i
*sum(i,
last))
%mod*tmp)
%mod;
}
tmp=n
*m%mod*n%mod;
for(i=
1;i<=n;i=
last+
1)
{
last=min(n/(n/i),
m/(m/i));
tmp=(tmp-n
*(m/i)
%mod*sum(i,
last)-
m*(n/i)
%mod*sum(i,
last))
%mod;
tmp=(tmp+(n/i)
*(m/i)
%mod*sum2(i,
last))
%mod;
}
ans=(ans-tmp)
%mod;
printf(
"%lld",(ans+mod)
%mod);
return 0;
}