题意

注:默认\(n\leqslant m\)。

所求即为:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\)

因为\(i*j=\gcd(i,j)*lcm(i,j)\),因此原式为:

\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\frac{i*j}{\gcd(i,j)}\)

枚举\(gcd(i,j)=d\):

\(\sum\limits_{d=1}^{n}\frac{1}{d}*\sum\limits_{i=1}^{n}\sum\limits_{j=1}^mi*j*[\gcd(i,j)=d]\)

套路地提出\(d\):

\(\sum\limits_{d=1}^{n}\frac{1}{d}\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}i*d*j*d*[\gcd(i,j)=1]\)

即:

\(\sum\limits_{d=1}^{n}d*\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}i*j*[\gcd(i,j)=1]\)

用莫比乌斯函数性质替换\([\gcd(i,j)=1]\):

\(\sum\limits_{d=1}^{n}d*\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}i*j*\sum\limits_{x|\gcd(i,j)}\mu(x)\)

转而枚举\(x\):

\(\sum\limits_{d=1}^{n}d*\sum\limits_{x=1}^{\frac{n}{d}}\mu(x)\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}i*j*[x|\gcd(i,j)]\)

把\([x|\gcd(i,j)]\)去掉:

\(\sum\limits_{d=1}^{n}d*\sum\limits_{x=1}^{\frac{n}{d}}x^2*\mu(x)\sum\limits_{i=1}^{\frac{n}{d*x}}\sum\limits_{j=1}^{\frac{m}{d*x}}i*j\)

即:

\(\sum\limits_{d=1}^{n}d*\sum\limits_{x=1}^{\frac{n}{d}}x^2*\mu(x)(\sum\limits_{i=1}^{\frac{n}{d*x}}i)(\sum\limits_{j=1}^{\frac{m}{d*x}}j)\)

求几个前缀和,第二个和第三四个都可以除法分块即可。

另一种做法

code:

#include<bits/stdc++.h>
using namespace std;
#define re register
const int maxn=10000010;
const int mod=20101009;
const int inv2=10050505;
int n,m,ans;
int mu[maxn],sum[maxn];
bool vis[maxn];
vector<int>prime;
inline void shai(int n)
{
vis[1]=1;mu[1]=1;
for(re int i=2;i<=n;i++)
{
if(!vis[i])prime.push_back(i),mu[i]=-1;
for(re unsigned int j=0;j<prime.size()&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
}
for(re int i=1;i<=n;i++)sum[i]=(sum[i-1]+1ll*mu[i]*i%mod*i%mod)%mod;
}
inline int calc(int l,int r){return 1ll*(r-l+1)*(l+r)%mod*inv2%mod;}
int main()
{
shai(10000000);
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
for(re int ld=1,rd;ld<=n;ld=rd+1)
{
rd=min(n/(n/ld),m/(m/ld));
int res=0;
for(re int l=1,r;l<=n/ld;l=r+1)
{
r=min((n/ld)/((n/ld)/l),(m/ld)/((m/ld)/l));
res=(res+1ll*(sum[r]-sum[l-1])*calc(1,(n/ld)/l)%mod*calc(1,(m/ld)/l)%mod)%mod;
}
ans=(ans+1ll*res*calc(ld,rd)%mod)%mod;
}
printf("%d",(ans+mod)%mod);
return 0;
}

最新文章

  1. MongoDB安全和认证
  2. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
  3. matlab练习程序(矩形变换为单连通形状)
  4. CC2540 USB Dongle 使用说明
  5. MyEclipse下直接查看class文件 jadnt158下载
  6. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
  7. poj 1218 THE DRUNK JAILER【水题】
  8. adb logcat命令查看并过滤android输出log
  9. dubbo源码分析二:服务发布
  10. (原创)看我用各种姿势在手机和PC查看到连接到的wifi密码
  11. cpp(第九章)
  12. poj_2186: Popular Cows(tarjan基础题)
  13. javascript DOM document对象
  14. ubuntu重装指定版本的mysql
  15. Gulp(自动化构建工具 )
  16. python列表中的所有值转换为字符串,以及列表拼接成一个字符串
  17. 项目中使用sass,如何实现自动编译
  18. 处理数据库 Ora-00845: memory_traget not supported on this system 的错误
  19. Scala集合(一)
  20. MySQL乐观锁和悲观锁的概念和原理

热门文章

  1. mq代替db
  2. 震惊!CCF改名为中国沙雕化学学会!!!
  3. 数据分析常用的Excel函数
  4. 关于使用IDEA,使用Maven打包项目
  5. Elasticsearch搜索调优权威指南 (2/3)
  6. Spring-AOP源码分析随手记(二)
  7. OpenGL入门1.1:窗口
  8. minggw 安装
  9. ASP.NET Core系列:JWT身份认证
  10. js javascript map函数去重功能的使用实例