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 ...
随机推荐
- 通过surging的后台托管服务编写任务调度并支持规则引擎自定义脚本
简介 过去,如果在业务中需要处理任务调度的时候,大家都会使用第三方的任务调度组件,而第三方组件有一套自己的规则,在微服务的中显得那么格格不入,这样就会造成代码臃肿,耦合性高,如果有分布式还需要搭建新的 ...
- css images图片铺满 不变型 以及头像裁剪 属性
一,图片的引入 background:url(img_flwr.gif); background-repeat:no-repeat; //平铺 二,图片的大小不不变形 background-size: ...
- ArcObjects SDK开发 024开发的技术和技巧
1.基本技术 开发方面.会使用C#开发语言和Visual Studio开发工具.会使用WinForm或者WPF开发. 理论知识方面.了解GIS的相关概念,例如矢量数据,栅格数据,空间参考.比例尺等概念 ...
- 【Python】pip的镜像安装异常解决方案
在安装pip的出现异常提示: ERROR: Could not find a version that satisfies the requirement pillow (from versions: ...
- Kaliの一些网络操作
KAlIの一些网络操作 arping -c 192.168.10.1 缺点是只能对单一ip进行探测,可利用shell脚本进行网段探测扫描 netdiscover -i eth0 -r 192.168. ...
- jQuery烟花效果
1.依赖源码 (function($){$.fn.fireworks=function(options){options=options||{};options.opacity=options.opa ...
- [cocos2d-x]飞机大战 遇到的bug和总结(一)
第一点: Sequence* sequence=Sequence::create(actionMove, actionFinished,NULL); create方法的最后必须加上NULL,不然会报出 ...
- 02安装一个最小化的Hadoop
安装一个最小化的Hadoop 为了学习HDFS和之后的MapReduce,我们需要安装一个Hadoop. Hadoop一共有3种运行模式 独立模式:不启动守护进程,所有程序运行在一个JVM进程中.独立 ...
- 图文并茂quasar2.6+vue3+ts+vite创建项目并引入mockjs,mockjs 拦截ajax请求的原理是什么,quasar为什么要使用boot?
每天都要开心(▽)哇: 首先呢,我们来创建项目 执行下面命令,开始创建项目啦 $ npm i -g @quasar/cli $ npm init quasar 下面是我的选项,仅供参考哇 √ What ...
- Keil 5(Keil C51)安装与注册 [ 图文教程 ]
前言 Keil C51 是 51 系列兼容单片机 C 语言软件开发系统,支持 8051 微控制器体系结构的 Keil 开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发 ...