洛谷 P6222 - 「P6156 简单题」加强版(莫比乌斯反演)
题意:
\(T\) 组数据,求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^k\mu^2(\gcd(i,j))\gcd(i,j)\)
弱化版中 \(T=1\),\(n \leq 5 \times 10^6\)
强化版中 \(T=10^4\),\(n \leq 10^7\)
推式子:
\]
\]
\]
\]
\]
令 \(s(x)=\sum\limits_{i=1}^x\sum\limits_{j=1}^x(i+j)^k\)
\]
\]
\]
令 \(f(t)=\sum\limits_{d|t}d\mu^2(d)\mu(\frac{t}{d})\)
\]
预处理 \(s(x)\) 和 \(g(x)=\sum\limits_{i=1}^xf(i)i^k\),就可以使用整除分块在 \(\sqrt{n}\) 的时间内求出。
接下来我们的问题就是如何求出 \(s(x)\) 和 \(g(x)\)。
首先预处理 \(i^k\) 肯定是需要的。不过一个个快速幂会超时,不过发现 \(i^k\) 是一个积性函数,欧拉筛解决,这部分时间复杂度 \(\pi(n)\log k\)。
对于 \(s(x)\),直接求肯定不太容易,我们不妨转化为枚举 \(t \in [2,2x]\),观察 \(t^k\) 被贡献了几次。
例如 \(x=4\),\(s(4)=1 \times 2^k+2 \times 3^k+3 \times 4^k+4 \times 5^k+3 \times 6^k+2 \times 7^k+1 \times 8^k\)
观察每一项前面的系数,发现了什么。呈阶梯状分部!
预处理 \(w(x)=\sum\limits_{i=1}^xi^x \times (x-i+1)\),稍微画个图就会发现 \(s(x)=w(2x)-2w(x)\)
接下来是 \(g(x)\),要求出 \(g(x)\),肯定要先求出 \(f(x)\)。
由于 \(f(x)\) 是 \(x\mu^2(x)\) 与 \(mu(x)\) 的狄利克雷卷积,而两项都是积性函数,故 \(f(x)\) 也是积性函数。
因此可以用欧拉筛求出 \(f(x)\)。假设 \(x\) 质因数分解里面有一项 \(p^q\),我们考虑这一项对答案的贡献。
若 \(q=1\),\(1\times\mu^2(1)\times\mu(p)+p\times\mu^2(p)\times\mu(1)=p-1\)
若 \(q=2\),\(1\times\mu^2(1)\times\mu(p^2)+p\times\mu^2(p)\times\mu(p)+p^2\times\mu^2(p^2)\times\mu(1)=-p\)
若 \(q\geq 3\),那么 \(d\) 与 \(\frac{p^q}{d}\) 中必定有一项的幂 \(\geq 2\),故 \(f(p^q)=0\)。
\(s(x)\) 与 \(g(x)\) 都求出来了,本题也就迎刃而解了。
/*
Contest: -
Problem: P6222
Author: tzc_wk
Time: 2020.9.24
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
#define int unsigned int
typedef pair<int,int> pii;
typedef long long ll;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
int T=read(),N=read(),k=read();
inline int qpow(int x,int e){
int ans=1;
while(e){
if(e&1) ans=ans*x;
x=x*x;e>>=1;
} return ans;
}
int pr[20000005],pcnt=0,f[20000005],p[20000005];
bool vis[20000005];
inline void prework(int n){
f[1]=p[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){pr[++pcnt]=i;f[i]=i-1;p[i]=qpow(i,k);}
for(int j=1;j<=pcnt&&pr[j]*i<=n;j++){
p[pr[j]*i]=p[i]*p[pr[j]];vis[pr[j]*i]=1;
if(i%pr[j]) f[pr[j]*i]=f[pr[j]]*f[i];
else{
int lft=i/pr[j];
if(lft%pr[j]) f[pr[j]*i]=-pr[j]*f[lft];
else f[pr[j]*i]=0;
break;
}
}
}
fz(i,1,n) f[i]=f[i-1]+f[i]*p[i];
fz(i,1,n) p[i]+=p[i-1];
fz(i,1,n) p[i]+=p[i-1];
}
inline int sum(int x){
return (p[x<<1]-(p[x]<<1));
}
signed main(){
prework(N<<1);
while(T--){
int n=read(),ans=0;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(f[r]-f[l-1])*sum(n/l);
}
cout<<ans<<endl;
}
return 0;
}
洛谷 P6222 - 「P6156 简单题」加强版(莫比乌斯反演)的更多相关文章
- P6222 「简单题」加强版 莫比乌斯反演 线性筛积性函数
LINK:简单题 以前写过弱化版的 不过那个实现过于垃圾 少预处理了一个东西. 这里写一个实现比较精细了. 最后可推出式子:\(\sum_{T=1}^nsum(\frac{n}{T})\sum_{x| ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演
题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005 洛谷 P1447 https://www.luogu.org/ ...
- 「bzoj3687: 简单题」
题目 发现需要一个\(O(n\sum a_i )\)的做法 于是可以直接做一个背包,\(dp[i]\)表示和为\(i\)的子集是否有奇数种 \(bitset\)优化一下就好了 #include< ...
- 洛谷P7814 「小窝 R3」心の記憶
题意 第一行给定两个数字\(n\) \(m\) \((m \ge n)\)分别代表给定字符串长度以及需要构造出的字符串长度 第二行给定一个长度为\(n\)的字符串 (假设原来的字符串是\(a\) 需要 ...
- P6222-「P6156 简单题」加强版【莫比乌斯反演】
正题 题目链接:https://www.luogu.com.cn/problem/P6222 题目大意 给出\(k\),\(T\)组询问给出\(n\)求 \[\sum_{i=1}^n\sum_{j=1 ...
- Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)
题目链接:https://loj.ac/problem/528 题目:给定两个正整数N,M,你需要计算ΣΣu(gcd(i,j))^2 mod 998244353 ,其中i属于[1,N],j属于[1,M ...
- 洛谷 P4710 「物理」平抛运动
洛谷 P4710 「物理」平抛运动 洛谷传送门 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图,一个可以视为质点的小球在点 A(x_0, ...
- 洛谷比赛 「EZEC」 Round 4
洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...
随机推荐
- nexus设置npm下载管理
nexus设置npm下载管理 第一步 登录私服网页 第二步 创建存储空间(如果使用默认的存储空间,此步骤可省略) 第三步 输入空间的名称,点击create创建 第四步 创建仓库 npm的仓库有三种: ...
- SharkCTF2021 BabyGame
web类题. 访问题给页面,页面里没啥信息.抓包,发现: 访问它,发现是一个游戏. F12之后看调试器里的js代码,发现: console.log("balabalabala"); ...
- 第五章第四周习题: Transformers Architecture with TensorFlow
目录 Transformer Network Packages 1 - Positional Encoding 1.1 - Sine and Cosine Angles Exercise 1 - ge ...
- oo第四次博客-UML暨学期总结
一. 本单元两次作业架构设计 这两次作业实际上难度不大,不存在算法上的难题,大部分时间都是用在处理UML图中各个元素的关系上. 第一次UML主要处理UML类图.有UMLclass,UMLinterfa ...
- mac上安装lua
一.背景 最近在操作redis的时候,有些时候是需要原子操作的,而redis中支持lua脚本,因此为了以后学习lua,此处记录一下 lua的安装. 二.mac上安装lua 其余的系统上安装lua步骤大 ...
- mongodb的聚合操作
在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用 聚合框架(aggregation) 来完成.在mongodb ...
- Noip模拟16 2021.7.15
题目真是越来越变态了 T1 Star Way To Heaven 首先,你要看出这是一个最小生成树的题(妙吧?) 为什么可以呢? 我们发现从两点连线的中点过是最优的,但是上下边界怎么办呢? 我们把上下 ...
- Spring Security:如何在Postman中优雅地测试后端API(前后端分离)
前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...
- cf13C Sequence(DP)
题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...
- 服务集与AP的配合
一.实验目的 1)掌握添加无线网络配置 2)掌握配置信道和协议使用并配置在一个天线上同时运行两个服务集,即两个无线网络 二.实验仪器设备及软件 仪器设备:一台AC,两台AP,一台AR,一台LSW 软件 ...