LG P4449 & JZOJ 于神之怒
\(\text{Problem}\)
JZOJ上,求
\]
对 \(10^9+7\) 取模
\(n,m,k \le 5 \times 10^6\)
LG 上,是一个加强版,有 \(T(T\le 2 \times 10^3)\) 组数据
\(\text{Analysis}\)
依照套路的方法,我们可以推出
\]
若只有一组数据,那么
数论分块套数论分块 \(O(n^{\frac{3}{4}})\) 即可
加上线筛 \(O(n)\)
\(\text{Code}\)
#include<cstdio>
#include<iostream>
#define LL long long
#define re register
using namespace std;
const int N = 5e6, P = 1e9 + 7;
int n, m, k, totp, pr[N], vis[N + 5], sum[N + 5], pk[N + 5];
inline int fpow(LL x, LL y)
{
LL res = 1;
for(; y; y >>= 1)
{
if (y & 1) res = res * x % P;
x = x * x % P;
}
return res;
}
inline void Euler()
{
vis[1] = sum[1] = pk[1] = 1;
for(re int i = 2; i <= N; i++)
{
if (!vis[i]) pr[++totp] = i, sum[i] = -1, pk[i] = fpow(i, k);
for(re int j = 1; j <= totp && i * pr[j] <= N; j++)
{
vis[i * pr[j]] = 1, pk[i * pr[j]] = (LL)pk[i] * pk[pr[j]] % P;
if (!(i % pr[j])) break;
sum[i * pr[j]] = -sum[i];
}
}
for(re int i = 1; i <= N; i++) sum[i] += sum[i - 1], pk[i] = (pk[i] + pk[i - 1]) % P;
}
inline int F(int n, int m)
{
LL res = 0;
for(re int l = 1, r; l <= min(n, m); l = r + 1)
{
r = min(n / (n / l), m / (m / l));
res = (res + (LL)(sum[r] - sum[l - 1] + P) * (n / l) % P * (m / l)) % P;
}
return res;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
Euler();
LL ans = 0;
for(re int l = 1, r; l <= min(n, m); l = r + 1)
{
r = min(n / (n / l), m / (m / l));
ans = (ans + (LL)(pk[r] - pk[l - 1] + P) * F(n / l, m / l) % P) % P;
}
printf("%lld\n", ans);
}
但LG上有多组数据,显然太慢了
同样套路地 \(T=pd\)
然后这个式子成了
\]
\(g(d)=d^k\) 显然是个积性函数,然后 \(G=g * mu\) 也是个积性函数
于是我们考虑线筛预处理 \(G\),然后数论分快做到单次 \(O(\sqrt n)\)
根据积性函数性质有 \(G(d) = \prod_{i=1} G({p_i}^{c_i})\)
然后我们思考什么样的数有贡献
\]
因为 \(\mu\) 的性质,我们知道,只有当 \(j=0\) 或 \(j=1\) 时有贡献,于是有
G(n)
&= \prod_{i=1} \mu(1) {p_i}^{c_i k} + \mu(p_i) {p_i}^{(c_i-1)k} \\
&= \prod_{i=1} {p_i}^{c_i k} - {p_i}^{(c_i-1)k} \\
&= \prod_{i=1} {p_i}^{(c_i-1) k}({p_i}^k-1)
\end{aligned}
\]
当 \(c_i = 1\) 的时候,就是质数的时候,\(G(p)=p^k-1\)
因为 \(G\) 是积性函数,所以 \(G(ab)=G(a)G(b)(\gcd(a,b)=1)\)
若 \(a,b\) 不互质,因为在线筛时枚举质数,所以 \(b\in \mathbb P\),设 \(a = a' p^c(\gcd(a,a')=1)\)
那么 \(G(ab)=G(a')G(p^{c+1})=G(a')p^{ck}(p^k-1)\)
线筛过程中 \(p^{(c-1)k}(p^k-1)\) 已计入 \(G(ab)\) 中,所以本次再乘上 \(p^k\) 即可
综上
\begin{cases}
G(a)G(b) & \gcd(a,b)=1 \\
G(a)b^k & \gcd(a,b)>1
\end{cases}
\]
线筛即可完美处理
\(\text{Code}\)
#include<cstdio>
#include<iostream>
#define LL long long
#define re register
using namespace std;
const int N = 5e6, P = 1e9 + 7;
int n, m, k, totp, pr[N], vis[N + 5], pk[N + 5];
LL sum[N + 5];
inline int fpow(LL x, LL y)
{
LL res = 1;
for(; y; y >>= 1)
{
if (y & 1) res = res * x % P;
x = x * x % P;
}
return res;
}
inline void Euler()
{
vis[1] = sum[1] = pk[1] = 1;
for(re int i = 2; i <= N; i++)
{
if (!vis[i]) pr[++totp] = i, pk[i] = fpow(i, k), sum[i] = (pk[i] - 1 + P) % P;
for(re int j = 1; j <= totp && i * pr[j] <= N; j++)
{
vis[i * pr[j]] = 1, pk[i * pr[j]] = (LL)pk[i] * pk[pr[j]] % P;
if (i % pr[j]) sum[i * pr[j]] = sum[i] * sum[pr[j]] % P;
else{sum[i * pr[j]] = sum[i] * pk[pr[j]] % P; break;}
}
}
for(re int i = 1; i <= N; i++) sum[i] = (sum[i] + sum[i - 1]) % P;
}
int main()
{
int T; scanf("%d%d", &T, &k);
Euler();
for(; T; T--)
{
scanf("%d%d", &n, &m);
LL ans = 0;
for(re int l = 1, r; l <= min(n, m); l = r + 1)
{
r = min(n / (n / l), m / (m / l));
ans = (ans + (sum[r] - sum[l - 1] + P) * (n / l) % P * (m / l)) % P;
}
printf("%lld\n", ans);
}
}
LG P4449 & JZOJ 于神之怒的更多相关文章
- Solution -「洛谷 P4449」于神之怒加强版
\(\mathcal{Description}\) Link. 给定 \(k\) 和 \(T\) 组 \(n,m\),对于每组,求 \[\sum_{i=1}^n\sum_{j=1}^m\ope ...
- P4449 于神之怒加强版 (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P4449 给定n,m,k,计算 \(\sum_{i=1}^n \sum_{j=1}^m \mathrm{gc ...
- 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...
- P4449 于神之怒加强版
\(\color{#0066ff}{ 题目描述 }\) 给定n,m,k,计算 \(\sum_{i=1}^n \sum_{j=1}^m \mathrm{gcd}(i,j)^k\) 对1000000007 ...
- 并不对劲的p4449于神之怒加强版
题目大意 给定\(t,k(t\leq2000,k\leq5*10^6)\) \(t\)组询问,每组给出\(n,m(n,m\leq5*10^6)\)求$\sum_{i=1}^n \sum_{j=1}^m ...
- 题解 P4449 于神之怒加强版
这道题算是我完完整整推的第一道题,写篇题解纪念一下. 题目 废话不多说,直接开始推式子(给新手准备,过程较详细,大佬可自行跳步),以下过程中均假设 \((n\le m)\),\([d=1]\) 类似于 ...
- [jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)
题目链接: https://jzoj.net/senior/#main/show/6087 题目: 题解: 只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$ =$exp(\ ...
- Linux下安装性能测试负载机LG
系统:CentOS release 6.6 (Final) x86_64 安装包: 1.LRLG_00031.iso [Load Generator Standalone (Linux 64-bit ...
- bootstrap 之 xs,sm,md,lg && 主要颜色
mobile – xs ( <768px ) tablet – sm ( 768~991px ) desktop – md ( 992~1170px ) large desktop – lg ( ...
- 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 241 Solved: 119[Submit][Status][Discu ...
随机推荐
- 【每日一题】【动态规划】2022年2月22日-NC59 矩阵的最小路径和
描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和. 例如:当输入[[1,3,5,9], ...
- 【每日一题】【将cur的next尾插到pre后面,尾插k-1次】25. K 个一组翻转链表-211115&220120
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 进阶: 你可以设 ...
- Python数据类型+运算符
Python基础数据类型 上期练习讲解 # 练习一.想办法打印出jason l1 = [11, 22, 'kevin', ['tony', 'jerry', [123, 456, 'jason'] ] ...
- plsql developer切换用户
方法1: 1.双击plsql developer桌面软件图标启动软件 2.在连接窗口中填写连接信息,连接数据库 3.在新建窗口下拉选项中,选择命令窗口功能 4.在工作区内会出现当前用户连接数据库的窗口 ...
- JavaScript:操作符:逻辑运算符及其隐式转换数据类型
逻辑非! 用来对布尔值进行取反,即!true = false: 当取反的变量不是布尔值,会进行隐式转换为布尔值: 非0的数字,都转换为true 非空字符串,转换为true 非空对象,转换为true I ...
- go语言行为(方法)的两种定义差别
概述: go在定义方法时,有如下两种表示形式: 第一种,在实例方法被调用时,会产生值复制 func (e Employee) String() string {} 第二种,不会进行内存拷贝,所以通常情 ...
- 能将三次握手讲到这个程度,不给你offer给谁!
摘要:在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过. 本文分享自华为云社区<能将三次握手理解到这个深度,面试官拍案叫绝~>,作者:龙哥手记. 在后端相关 ...
- 从Babel开始认识AST抽象语法树
前言 AST抽象语法树想必大家都有听过这个概念,但是不是只停留在听过这个层面呢.其实它对于编程来讲是一个非常重要的概念,当然也包括前端,在很多地方都能看见AST抽象语法树的影子,其中不乏有vue.re ...
- day07-Vue04
Vue04 12.Vue2 脚手架模块化开发 目前开发模式的问题: 开发效率低 不够规范 维护和升级,可读性比较差 12.1基本介绍 官网地址 什么是Vue Cli脚手架 12.2环境配置,搭建项目 ...
- BBS项目功能编写逻辑思路汇总
BBS项目功能编写逻辑思路汇总 一.BBS创数据表 二.BBS注册功能 三.BBS登录功能 四.BBS首页搭建 五.BBS修改密码 六.BBS个人站点 七.BBS文章详情 八.BBS导入模块 九.BB ...