题意:$\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^m {lcm(i,j)} } $

解题关键:

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

枚举gcd,上式化为:

$\sum\limits_{d = 1}^{\min (n,m)} {d\sum\limits_{\begin{array}{*{20}{c}}
{\gcd (i,j) = = 1}\\
{1 < = i < = n/d}\\
{1 < = j < = m/d}
\end{array}} {i*j} } $

$f(n,m,k) = \sum\limits_{\begin{array}{*{20}{c}}
{\gcd (i,j) = = k}\\
{1 < = i < = n}\\
{1 < = j < = m}
\end{array}} {i*j} $

由于

$sum(n,m) = \sum\limits_{\begin{array}{*{20}{c}}
{1 < = i < = n}\\
{1 < = j < = m}
\end{array}} {i*j} = \frac{{n(n + 1)}}{2}\frac{{m(m + 1)}}{2}$

$\begin{array}{l}
F(n,m,k) = \sum\limits_{k|d} {f(n,m,d) = \sum\limits_{\begin{array}{*{20}{c}}
{1 < = i < = n}\\
{1 < = j < = m}\\
{k|\gcd (i,j)}
\end{array}} {i*j} = {k^2}sum(\left\lfloor {\frac{n}{k}} \right\rfloor ,\left\lfloor {\frac{m}{k}} \right\rfloor )} \\
f(n,m,k) = \sum\limits_{k|d} {u(\frac{d}{k})F(n,m,d)}
\end{array}$

而此题中,$k==1$,

则,

$\begin{array}{l}
f(n,m,1) = \sum\limits_{d = 1}^{\min (n,m)} {u(d)F(n,m,d)} \\
= \sum\limits_{d = 1}^{\min (n,m)} {u(d){d^2}sum(\left\lfloor {\frac{n}{d}} \right\rfloor ,\left\lfloor {\frac{m}{d}} \right\rfloor )} \\
ans = \sum\limits_{d = 1}^{\min (n,m)} {d*f(\left\lfloor {\frac{n}{d}} \right\rfloor ,\left\lfloor {\frac{m}{d}} \right\rfloor ,1)}
\end{array}$

求解ans和$f$函数复杂度都是$O(\sqrt n )$,所以最终复杂度为$O(n)$。

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<iostream>
#define Sum(x,y) (x*(x+1)/2%mod*(y*(y+1)/2%mod)%mod)
using namespace std;
typedef long long ll;
const ll mod=;
const ll maxn=+;
ll n,m;
bool vis[maxn];
ll prime[maxn],mu[maxn],sum1[maxn];
void init_mu(ll n){
ll cnt=;
mu[]=;
for(ll i=;i<n;i++){
if(!vis[i]){
prime[cnt++]=i;
mu[i]=-;
}
for(ll j=;j<cnt&&i*prime[j]<n;j++){
vis[i*prime[j]]=;
if(i%prime[j]==){mu[i*prime[j]]=;break;}
else { mu[i*prime[j]]=-mu[i];}
}
}
sum1[]=;
for(ll i=;i<n;i++) sum1[i]=(sum1[i-]+1ll*mu[i]*i*i)%mod;
}
ll calf(ll n,ll m){
ll ans=,pos,len=min(n,m);
for(ll i=;i<=len;i=pos+){
pos=min(n/(n/i),m/(m/i));
//ans+=(sum1[pos]-sum1[i-1])%mod*((n/i)*((n/i)+1)/2%mod*(((m/i)+1)*(m/i)/2%mod)%mod);
ans+=(sum1[pos]-sum1[i-])%mod*Sum(n/i,m/i)%mod;//最好用函数写出
ans%=mod; }
return ans;
}
ll calres(ll n,ll m){
ll ans=,pos,len=min(n,m);
for(ll i=;i<=len;i=pos+){
pos=min(n/(n/i),m/(m/i));
ans+=(i+pos)*(pos-i+)/%mod*calf(n/i,m/i)%mod;
ans%=mod;
}
return (ans%mod+mod)%mod;
} int main(){
scanf("%lld%lld",&n,&m);
init_mu(min(n,m)+);
printf("%lld\n",calres(n,m));
return ;
}

最新文章

  1. 基于注解的Spring AOP的配置和使用
  2. 九月二十八JS验证
  3. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念
  4. linux概念之内存分析
  5. 初学Android 二 创建项目以及目录结构
  6. 20151221jqueryUI---日历UI代码备份
  7. apache配置文件中的项目
  8. Linux学习笔记29——IPC状态命令
  9. Bootstrap第一天
  10. hdu4417 Super Mario 树阵离线/划分树
  11. 进阶之初探nodeJS
  12. Lambda表达式和Java集合框架
  13. 【每天一道算法题】Numeric Keypad
  14. OD调试程序经常使用断点大全
  15. 你的响应阻塞了没有?--Spring-WebFlux源码分析
  16. jdbc crud
  17. SQL高级查询技巧
  18. U盘安装原版Win7或Win8教程
  19. [六字真言]6.吽.SpringMVC中上传大小异常填坑
  20. JAVA传入一个字符串,返回一个字符串中的大写字母

热门文章

  1. 【转】win7 任务计划 任务映像已损坏或篡改(异常来自HRESULT:0x80041321)
  2. PHP与js之间的交互
  3. python 基础 6.1 异常处理方法
  4. JVM相关小结
  5. ArcGIS api for js OverviewMap(鹰眼/概览图)
  6. while 循环中的break continue pass 的用法
  7. python基础教程_学习笔记11:魔法方法、属性和迭代器
  8. 性能优化——Web前端性能优化
  9. UVA - 11464 Even Parity 【暴力枚举】
  10. 打开Vs2010时,卡在加载工具箱内容 不动了