题目描述

给定正整数n,m。求
 

输入

一行两个整数n,m。

输出

一个整数,为答案模1000000007后的值。

样例输入

5 4

样例输出

424


题解

莫比乌斯反演

(为了方便,以下公式默认$n\le m$)

$\ \ \ \ \sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)^{gcd(i,j)}\\=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)=d](\frac{ij}d)^d\\=\sum\limits_{d=1}^n\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[gcd(i,j)=1](ijd)^d\\=\sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[gcd(i,j)=1](ij)^d\\=\sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}(ij)^d\sum\limits_{p|gcd(i,j)}\mu(p)\\=\sum\limits_{d=1}^nd^d\sum\limits_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)\sum\limits_{i=1}^{\lfloor\frac n{dp}\rfloor}\sum\limits_{j=1}^{\lfloor\frac m{dp}\rfloor}(ijp^2)^d\\=\sum\limits_{d=1}^nd^d\sum\limits_{p=1}^{\lfloor\frac nd\rfloor}p^{2d}\mu(p)\sum\limits_{i=1}^{\lfloor\frac n{dp}\rfloor}\sum\limits_{j=1}^{\lfloor\frac m{dp}\rfloor}i^dj^d\\=\sum\limits_{d=1}^nd^d\sum\limits_{p=1}^{\lfloor\frac nd\rfloor}p^{2d}\mu(p)\sum\limits_{i=1}^{\lfloor\frac n{dp}\rfloor}i^d\sum\limits_{j=1}^{\lfloor\frac m{dp}\rfloor}j^d$

此时暴力即可。。。本题就做完了。。。复杂度竟然是对的。。。

快筛$\mu$,再先枚举$d$,然后处理出$1\sim\lfloor\frac md\rfloor$中每个数的$d$次方及其前缀和。由于$d$是从小到大枚举的,因此可以递推出来。

然后只需要先用快速幂求$d^d$,其余的对于每一个$p$均可$O(1)$解出(其中$p^2d=(p^d)^2$),因此总的时间复杂度是每次快速幂的时间复杂度$O(n\log n)$+调和级数时间复杂度$O(n\ln n)$=$O(n\log n)$。

#include <cstdio>
#include <algorithm>
#define N 500010
#define mod 1000000007
using namespace std;
typedef long long ll;
int mu[N] , np[N] , prime[N] , tot;
ll b[N] , sum[N];
inline ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int main()
{
int n , m , i , j;
ll d , ans = 0;
scanf("%d%d" , &n , &m);
if(n > m) swap(n , m);
mu[1] = 1;
for(i = 2 ; i <= n ; i ++ )
{
if(!np[i]) mu[i] = -1 , prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else mu[i * prime[j]] = -mu[i];
}
}
for(i = 1 ; i <= m ; i ++ ) b[i] = 1;
for(i = 1 ; i <= n ; i ++ )
{
for(j = 1 ; j * i <= m ; j ++ )
b[j] = b[j] * j % mod , sum[j] = (sum[j - 1] + b[j]) % mod;
d = pow(i , i);
for(j = 1 ; j * i <= n ; j ++ )
ans = (ans + mu[j] * b[j] * b[j] % mod * d % mod * sum[n / i / j] % mod * sum[m / i / j] % mod + mod) % mod;
}
printf("%lld\n" , ans);
return 0;
}

最新文章

  1. 三大框架SSH整合
  2. 本地存储之cookie
  3. PHP 水印设置
  4. 一些性能查询的SQL 备忘
  5. td 自动换行
  6. WebSocket桌面客户端工具
  7. Search Range in Binary Search Tree
  8. [Python]解决python链式extend的技巧
  9. centos安装mysql(rpm)
  10. Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】
  11. ImageView 各种工具类
  12. 16.按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
  13. 如何找到java对应的c/c++源码
  14. 算法笔记-exgcd
  15. python开发规范和(configparser、random模块)
  16. Civil 3D 2017本地化中VBA程序移植到2018版中
  17. 043、data-packed volume container (2019-03-06 周三)
  18. Linux&#160;修改linux的SSH的默认端口
  19. (笔记)Linux下的简单CGI编程
  20. Graph_Master(连通分量_E_Hungry+Tarjan)

热门文章

  1. RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
  2. 小程序weapp的状态管理 Wenaox
  3. Redis连接工具类
  4. 爬虫学习(十五)——json解析
  5. linux 开机自启动 Tomcat
  6. Tinyhttpd 知识点
  7. lnamp高性能架构之apache和nginx的整合
  8. float元素浮动后高度不一致导致错位的解决办方法
  9. 申请qq第三方登录 http://www.php20.com/forum.php?mod=viewthread&amp;tid=29 (出处: 码农之家)
  10. Sqoop 工具使用