挺套路的题,然而一开始还是想错了……

$\sum_{i = 1}^{n}\sum_{j = 1}^{m}gcd(i, j) ^ {k} = \sum_{T = 1}^{min(n, m)}\left \lfloor \frac{n}{T} \right \rfloor \left \lfloor \frac{m}{T} \right \rfloor\sum_{d | T}\mu (\frac{T}{d}) * d^{k}$

我们设$h(i) =\sum_{d | T}\mu (\frac{T}{d}) * d^{k} $, 那么原式化为$ \sum_{T = 1}^{min(n, m)}\left \lfloor \frac{n}{T} \right \rfloor \left \lfloor \frac{m}{T} \right \rfloor h(i)$

我们做出$h(i)$的前缀和之后就可以整除分块了。

发现$h(i)$是一个积性函数,可以线性筛,具体筛法如下:

1、$h(1) = 1$

2、$h(p) = p^{k} - 1$($p$是一个质数)

3、考虑线性筛中的过程,$i * pri_{j}$被它的最小因子也就是$pri_{j}$筛掉,那么当$i$不是$pri_{j}$的倍数的时候,也就是说$h(i * pri_{j}) = h(i) * h(pri_{j})$。

  而当$pri_{j} | i$的时候,考虑分两步:($ i = \prod_{j = 1}^{m}p_{j}^{c_{j}}$)

  记$low_{i} =$ $i$的最小质因子被$i$包含的最大幂次积(即$p_{1} ^ {c_{1}}$)

  a、我们假设$low_{i}$不等于$i$,这句话等价于$i$不是一个质数的倍数,所以$\frac{i}{low_{i}}$ 与 $pri_{j} * low_{i}$互质,那么直接乘上就好了。

  b、当$low_{i}$等于$i$的时候,我们考虑一下$h(i)$函数的定义,展开式子之后发现$h(i) = pri_{j} ^ {mk} - pri_{j} ^ {(m - 1)k}$,而$h(i  * pri_{j}) = pri_{j} ^ {(m + 1)k} - pri_{j} ^ {mk}$,那么就相当于$h(i * pri_{j}) = h(i) * pri_{j}^{k}$。

时间复杂度$O(maxNlogmaxN + T\sqrt{n})$。

大时限题还感觉跑得挺快的。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 5e6 + ;
const ll P = 1e9 + ; int testCase, pCnt = , pri[N];
ll k, h[N], low[N], sum[N];
bool np[N]; template <typename T>
inline void read(T &X) {
X = ;
char ch = ;
T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline ll pow(ll a, ll b) {
ll res = 1LL;
for(; b > ; b >>= ) {
if(b & ) res = res * a % P;
a = a * a % P;
}
return res;
} inline void sieve() {
h[] = 1LL;
for(int i = ; i < N; i++) {
if(!np[i]) {
pri[++pCnt] = i;
low[i] = (ll)i;
h[i] =
(pow(i, k) - 1LL + P) % P;
}
for(int j = ; j <= pCnt && pri[j] * i < N; j++) {
np[i * pri[j]] = ;
if(i % pri[j] == ) {
low[i * pri[j]] = low[i] * pri[j];
if(low[i] == i) h[i * pri[j]] = h[i] * pow(pri[j], k) % P;
else h[i * pri[j]] = h[i / low[i]] * h[low[i] * pri[j]] % P;
break;
}
low[i * pri[j]] = pri[j];
h[i * pri[j]] = h[i] * h[pri[j]] % P;
}
} /* for(int i = 1; i < 20; i++)
printf("%lld ", phi[i]);
printf("\n");
for(int i = 1; i < 30; i++)
printf("%lld ", h[i]);
printf("\n"); */ /* for(int i = 1; i <= 20; i++)
printf("%lld ", h[i] % P); */ for(int i = ; i < N; i++)
sum[i] = (sum[i - ] + h[i] % P + P) % P;
} inline ll min(ll x, ll y) {
return x > y ? y : x;
} int main() {
read(testCase), read(k);
sieve();
for(ll n, m; testCase--; ) {
read(n), read(m);
ll ans = 0LL, rep = min(n, m);
for(ll l = , r; l <= rep; l = r + ) {
r = min((n / (n / l)), (m / (m / l)));
ans = (ans + (sum[r] - sum[l - ] + P) % P * (n / l) % P * (m / l) % P) % P;
}
printf("%lld\n", ans);
}
return ;
}

Luogu 4449 于神之怒加强版的更多相关文章

  1. 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛

    4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 241  Solved: 119[Submit][Status][Discu ...

  2. 【BZOJ4407】于神之怒加强版(莫比乌斯反演)

    [BZOJ4407]于神之怒加强版(莫比乌斯反演) 题面 BZOJ 求: \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^k\] 题解 根据惯用套路 把公约数提出来 \[\sum ...

  3. BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)

    4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1067  Solved: 494[Submit][Status][Disc ...

  4. bzoj 4407 于神之怒加强版 (反演+线性筛)

    于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1184  Solved: 535[Submit][Status][Discuss] D ...

  5. 【BZOJ4407】于神之怒加强版 莫比乌斯反演

    [BZOJ4407]于神之怒加强版 Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行, ...

  6. P4449 于神之怒加强版 (莫比乌斯反演)

    [题目链接] https://www.luogu.org/problemnew/show/P4449 给定n,m,k,计算 \(\sum_{i=1}^n \sum_{j=1}^m \mathrm{gc ...

  7. 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演

    https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...

  8. [BZOJ4407]于神之怒加强版

    BZOJ挂了... 先把程序放上来,如果A了在写题解吧. #include<cstdio> #include<algorithm> #define N 5000010 #def ...

  9. BZOJ 4407 于神之怒加强版

    http://www.lydsy.com/JudgeOnline/problem.php?id=4407 题意: 给下N,M,K.求 思路:  来自:http://blog.csdn.net/ws_y ...

随机推荐

  1. 【liunx】telnet命令

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  2. php 数据类型转换与比较

    <?php define("PI", 3.1415926); echo PI."<br>"; //定义一个常量 define("GR ...

  3. JZ2440 裸机驱动 第5章 GPIO接口

    本章目标:     掌握嵌入式开发的步骤:编程.编译.烧写程序.运行     通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍     S3C2440A有130个多功能输入/输出口引脚 ...

  4. 转-在Mac OS上搭建Python的开发环境

    在Mac OS上搭建Python的开发环境   本文转载自:http://www.jb51.net/article/76931.htm 一. 安装python mac系统其实自带了一个python的执 ...

  5. Winfrom 开源组件Control.FirefoxDialog使用

    1. 如果窗体是以模式窗体方式打开的,会出现点了应用,窗体就立马关闭.此时可能别的设置需要一块设置,这种就存在问题. var form1 = new Form1(); form1.ShowDialog ...

  6. Java--不可覆盖的方法

    私有方法不能被覆盖: 因为private被自动认为final,对子类是屏蔽的,那么子类中的相同方法就是一个新的方法,编译器不会报错但也不会按期望运行: public class ClassA { pr ...

  7. java web 程序---购物车项目内容:

    1.项目介绍   典型电子商务系统(在线购物平台).模拟了当当系统部分功能.2.功能需求    1)用户管理模块(3天)user         实现登录.注册功能    2)产品浏览模块(2天)ma ...

  8. Java 基于UDP的类似于QQ的循环通信

    package Day10; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetS ...

  9. 十、jdk工具之Jdb命令(The Java Debugger)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  10. vue语法精简(方便开发查阅)

    vue语法精简(方便开发查阅) 指令 特殊的标签和属性 变异方法 事件修饰符 按键修饰符 表单修饰符 生命周期函数 计算属性 监听属性 子组件通过事件向父组件传递信息 在组件上使用v-model 动画 ...