luogu P4240 毒瘤之神的考验(莫比乌斯反演+递推前缀和+数论分块)

problem

洛谷链接

solution

∑i=1n∑j=1mφ(ij)=∑i=1n∑j=1mφ(i)φ(j)gcd⁡(i,j)φ(gcd⁡(i,j))\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)=\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi{(\gcd(i,j))}}i=1nj=1mφ(ij)=i=1nj=1mφ(gcd(i,j))φ(i)φ(j)gcd(i,j)=∑d=1min⁡(n,m)dφ(d)∑i=1n∑j=1mφ(i)φ(j)[(i,j)=d]=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\big[(i,j)=d\big]=d=1min(n,m)φ(d)di=1nj=1mφ(i)φ(j)[(i,j)=d]=∑d=1min⁡(n,m)dφ(d)∑i=1⌊nd⌋∑j=1⌊md⌋φ(id)φ(jd)[(i,j)=1]=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\varphi(jd)\big[(i,j)=1\big]=d=1min(n,m)φ(d)di=1dnj=1dmφ(id)φ(jd)[(i,j)=1]=∑d=1min⁡(n,m)dφ(d)∑i=1⌊nd⌋∑j=1⌊md⌋φ(id)φ(jd)∑k∣(i,j)μ(k)=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{\lfloor\frac n d\rfloor}\sum_{j=1}^{\lfloor\frac m d\rfloor}\varphi(id)\varphi(jd)\sum_{k|(i,j)}\mu(k)=d=1min(n,m)φ(d)di=1dnj=1dmφ(id)φ(jd)k(i,j)μ(k)=∑d=1min⁡(n,m)dφ(d)∑k=1min⁡(⌊nd⌋,⌊md⌋)μ(k)∑i=1⌊ndk⌋φ(ikd)∑j=1⌊mdk⌋φ(jkd)=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{k=1}^{\min(\lfloor\frac nd\rfloor,\lfloor\frac m d\rfloor)}\mu(k)\sum_{i=1}^{\lfloor\frac{n}{dk}\rfloor}\varphi(ikd)\sum_{j=1}^{\lfloor\frac{m}{dk}\rfloor}\varphi(jkd)=d=1min(n,m)φ(d)dk=1min(dn,dm)μ(k)i=1dknφ(ikd)j=1dkmφ(jkd)∥t=dk⇔k=td\Bigg\lVert{t=dk\Leftrightarrow k=\frac{t}{d}}t=dkk=dt=∑t=1min⁡(n,m)∑d∣tdφ(d)μ(td)+∑i=1⌊nt⌋φ(it)∑j=1⌊mt⌋φ(jt)=\sum_{t=1}^{\min(n,m)}\sum_{d|t}\frac{d}{\varphi(d)}\mu(\frac td)+\sum_{i=1}^{\lfloor\frac nt\rfloor}\varphi(it)\sum_{j=1}^{\lfloor\frac mt\rfloor}\varphi(jt) =t=1min(n,m)dtφ(d)dμ(dt)+i=1tnφ(it)j=1tmφ(jt)

f(t)=∑d∣tdφ(d)μ(td)f(t)=\sum_{d|t}\frac{d}{\varphi(d)}\mu(\frac td)f(t)=dtφ(d)dμ(dt),在 O(nlog⁡n)O(n\log n)O(nlogn) 的时间内预处理。

g(a,b)=∑i=1bφ(i⋅a)g(a,b)=\sum_{i=1}^b\varphi(i·a)g(a,b)=i=1bφ(ia)
∑i=1n∑j=1mφ(ij)⇔∑i=1min⁡(n,m)f(i)⋅g(i,⌊ni⌋)⋅g(i,⌊mi⌋)\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\Leftrightarrow \sum_{i=1}^{\min(n,m)}f(i)·g(i,\lfloor\frac ni\rfloor)·g(i,\lfloor\frac mi\rfloor) i=1nj=1mφ(ij)i=1min(n,m)f(i)g(i,in)g(i,im)注意到有用的 g(a,b)g(a,b)g(a,b) 均满足 ab≤max⁡(n,m)ab\le \max(n,m)abmax(n,m),可以用动态二维数组预处理。

根据定义容易得递推式 :g(a,b)=g(a,b−1)+φ(ab):g(a,b)=g(a,b-1)+\varphi(ab):g(a,b)=g(a,b1)+φ(ab)

设前缀和 s(x,y,n)=∑i=1nf(i)g(i,x)g(i,y)s(x,y,n)=\sum_{i=1}^nf(i)g(i,x)g(i,y)s(x,y,n)=i=1nf(i)g(i,x)g(i,y),则有递推式 s(x,y,n)=s(x,y,n−1)+f(n)g(n,x)g(n,y)s(x,y,n)=s(x,y,n-1)+f(n)g(n,x)g(n,y)s(x,y,n)=s(x,y,n1)+f(n)g(n,x)g(n,y)

设定一个阈值 BBB,预处理所有 x≤B∧y≤Bx\le B\wedge y\le BxByBs(x,y,z)s(x,y,z)s(x,y,z),此时还满足 z≤nmax⁡(x,y)z\le \frac{n}{\max(x,y)}zmax(x,y)n,同理用动态三维数组存。

询问时枚举 iii
对于 ⌊ni⌋≤B∧⌊mi⌋≤B\lfloor\frac n i\rfloor\le B\wedge\lfloor\frac m i\rfloor\le BinBimB 直接暴力求 f(i)g(i,⌊ni⌋)g(i,⌊mi⌋)f(i)g(i,\lfloor\frac ni\rfloor)g(i,\lfloor\frac m i\rfloor)f(i)g(i,in)g(i,im)(反正都是预处理过的信息)。

其余部分利用预处理的前缀和 s(x,y,z)s(x,y,z)s(x,y,z) 直接整除分块计算。

假设当 i∈[l,r]i\in[l,r]i[l,r] 时,⌊ni⌋,⌊mi⌋\lfloor\frac n i\rfloor,\lfloor\frac m i\rfloorin,im 均相同,即 f(i)g(i,⌊ni⌋)g(i,⌊mi⌋)f(i)g(i,\lfloor\frac n i\rfloor)g(i,\lfloor\frac m i\rfloor)f(i)g(i,in)g(i,im) 相同,

∑i=lrf(i)g(i,x)g(i,y)=s(x,y,r)−s(x,y,l−1)\sum_{i=l}^rf(i)g(i,x)g(i,y)=s(x,y,r)-s(x,y,l-1)i=lrf(i)g(i,x)g(i,y)=s(x,y,r)s(x,y,l1)

查询时间复杂度 O(TnB+Tn)O(T\frac nB+T\sqrt{n})O(TBn+Tn),预处理时间 O(nlog⁡n+nB)O(n\log n+nB)O(nlogn+nB),空间复杂度 O(nB)O(nB)O(nB)

B=n13B=n^{\frac 1 3}B=n31 时复杂度较优秀。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 100005
#define maxB 60
int *g[maxn], *s[maxB][maxB];
int mu[maxn], phi[maxn], prime[maxn], f[maxn];
bool vis[maxn];
int cnt;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void sieve( int n = 1e5, int B = 50 ) {mu[1] = phi[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) {prime[++ cnt] = i;phi[i] = i - 1;mu[i] = -1;}for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;phi[i * prime[j]] = phi[i] * prime[j] % mod;break;}else {mu[i * prime[j]] = -mu[i];phi[i * prime[j]] = phi[i] * phi[prime[j]] % mod;}}}for( int i = 1;i <= n;i ++ )for( int j = i;j <= n;j += i )( f[j] += i * qkpow( phi[i], mod - 2 ) % mod * mu[j / i] ) %= mod;for( int i = 1;i <= n;i ++ ) {g[i] = new int [n / i + 5];g[i][0] = 0;for( int j = 1;i * j <= n;j ++ )g[i][j] = ( g[i][j - 1] + phi[i * j] ) % mod;}for( int i = 1;i <= B;i ++ )for( int j = 1;j <= B;j ++ ) {s[i][j] = new int [n / max( i, j ) + 5];s[i][j][0] = 0;for( int k = 1;k * max( i, j ) <= n;k ++ )s[i][j][k] = ( s[i][j][k - 1] + f[k] * g[k][i] % mod * g[k][j] ) % mod;}
}signed main() {sieve();int T, n, m, B = 50;scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &m );if( n > m ) swap( n, m );int ans = 0;for( int i = 1;i <= m / B;i ++ )( ans += f[i] * g[i][n / i] % mod * g[i][m / i] ) %= mod;for( int l = m / B + 1, r;l <= n;l = r + 1 ) {r = min( n / ( n / l ), m / ( m / l ) );( ans += s[n / l][m / l][r] - s[n / l][m / l][l - 1] ) %= mod;}printf( "%lld\n", ( ans + mod ) % mod );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可持久化(二)

文章目录【可持久化值域线段树/主席树】主席树代码【二维数点】例题【可持久化值域线段树/主席树】 P3834 【模板】可持久化线段树 1&#xff08;主席树&#xff09; 查询序列区间第k小&#xff0c;静态在线。给定 n 个整数构成的序列&#xff0c;将对于指定的闭区间查询其区间…

.NET Core / C# 开发 IOT 嵌入式设备的个人见解

( .NET Core 七龙珠 )一、IOT 平台的支持先看国内优秀的云计算IOT平台(不含QQ互联、小米IOT等针对特定产品的开发者平台&#xff0c;仅列出部分云计算厂商的IOT平台)阿里云 IOThttps://iot.aliyun.com/华为物联网https://developer.huawei.com/ict/cn/site-iot-next腾讯云 物联…

合成小丹(dp+二进制按位或+结论)

problem 给定 nnn 个在 [0,2ω−1][0,2^\omega-1][0,2ω−1] 内的整数。执行下面操作两种操作共 n−1n-1n−1 次&#xff1a; 选择两个整数 x,yx,yx,y 从数列中删去&#xff0c;并加入 ⌊x∣y2⌋\lfloor\frac{x|y}{2}\rfloor⌊2x∣y​⌋&#xff0c;这里的 | 表示按位或。选择…

P2633 Count on a tree

P2633 Count on a tree 题意&#xff1a; 给定一棵 n 个节点的树&#xff0c;每个点有一个权值。有 m 个询问&#xff0c;每次给你 u,v,k&#xff0c;你需要回答 u xor last 和 v 这两个节点间第 k 小的点权。 其中last 是上一个询问的答案&#xff0c;定义其初始为 0&#…

[NewLife.XCode]增量累加

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

King of Range

King of Range 题意&#xff1a; 给你n个数&#xff0c;有m个询问&#xff0c;每次询问一个x&#xff0c;问有多少个区间的最大值减最小值大于x 题解&#xff1a; 我一开始的想法 st表实现区间最大减最小&#xff0c;利用二分来找这个区间范围&#xff0c;复杂度O(nmlogn)&…

膜拜大丹(结论+二元环)

problem 有两个国家&#xff0c;国家 AAA 有 nnn 座城市&#xff0c;国家 BBB 有 mmm 座城市&#xff0c;两个国家间有若干条单向航线。 具体地&#xff0c;有长度为 nnn 的数组 aaa 和长度为 mmm 的数组 bbb。国家 AAA 的第 iii 座城市有单向航线可以到达国家 BBB 的 1∼ai1…

Jewels

Jewels 题意&#xff1a; 你的坐标是(0,0,0)&#xff0c;有m个宝物&#xff0c;分别坐标是是(xi,yi,zi),它的z坐标以每秒下沉vi深度&#xff0c;你每次获取一个宝物的费用是两者的距离的平方&#xff0c;每秒只能获取一个宝物&#xff0c;从第0秒开始&#xff0c;问获取所有宝…

[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[学习笔记] 二分图基础定理的相关证明

最小点集覆盖最大匹配 最小点集覆盖&#xff1a;选出最少的点使得每条边都至少有一个端点被选。 先证最小点集覆盖 ≥\ge≥ 最大匹配 假设最大匹配为 xxx&#xff0c;即有 xxx 条边两两之间没有公用点。 光覆盖这些边就要用到 xxx 个点。 “不少于”已证。 再证最小点集覆盖 …

Boxes

Boxes 题意&#xff1a; 有n个盒子&#xff0c;每个盒子里要么是黑球&#xff0c;要么是白球&#xff0c;你可以花C的代码得知剩下所有盒子中黑球数量和白球数量&#xff0c;(只是知道总数量&#xff0c;并不知道具体哪个盒子里是什么)&#xff0c;你可以可以花费wi的代价开第…

Double Strings

Double Strings 题意&#xff1a; 给你s和t两个字符串&#xff0c;在其中选出两个等长的子序列(可以不连续)a&#xff0c;b&#xff0c;满足a的字典序严格小于b的字典序&#xff0c;问方案数,答案mod(1e97) 题解&#xff1a; 好的方案的构成是一段相同的前缀一个不同的字符…

你真的了解用户吗?-浅谈《用户画像》的意义和方法

作者&#xff1a;陈炯关于作者系统集成项目管理高级工程师某大型国有银行高级质量管理师从事IT项目管理工作十余年具有丰富的开发与管理经验公司内部敏捷转型的发起者之一深度参与敏捷实践与总结大学校园里流传最广的一句话是什么&#xff1f;“防火防狼防师兄”。为什么师兄这…

[学习笔记] 二次剩余

二次剩余 对于素数 ppp 和数 aaa&#xff0c;满足 (a,p)1(a,p)1(a,p)1。&#xff08;注意 aaa 不一定小于 ppp&#xff09; 若 ∃xx2≡a(modp)\exist_{x}\ x^2\equiv a\pmod p∃x​ x2≡a(modp)&#xff0c;则称 aaa 是模 ppp 意义下的二次剩余&#xff0c;xxx 称为该二次剩余…

Script Lab 续:为 Officejs 开发配置 VSCode 环境

垫场AA&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念--------------------------------------------------前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具前期02&#xff1a;尝试&#xff1a;Script Lab&…

P3567 [POI2014]KUR-Couriers

P3567 [POI2014]KUR-Couriers 题意&#xff1a; 给一个长度为 n 的正整数序列 a。共有 m 组询问&#xff0c;每次询问一个区间 [l,r] &#xff0c;是否存在一个数在 [l,r]中出现的次数严格大于一半。如果存在&#xff0c;输出这个数&#xff0c;否则输出 0。 题解&#xff1…

[WC 2022 Day3 zmy] Od deski do deski(dp)

设 fi:1∼if_{i}:1\sim ifi​:1∼i 能否分成若干个首尾相同的区间 则有 fiORj<i(fj−1∧ajai)f_{i}\text{OR}_{j<i}(f_{j-1}\wedge a_ja_i)fi​ORj<i​(fj−1​∧aj​ai​)。 这是最原始的暴力 dpdpdp&#xff0c;时间 O(n2m)O(n^2m)O(n2m)。 事实上&#xff0c;这…

编程方式重启 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”常言道&#xff0c;多喝热水&#xff0c;重启试试。有时候当应用工作不正常&#xff0c;重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际&#…

可持久化3--可持久化01Trie

01Trie 可持久化 01Trie 的方式和可持久化值域线段树的方式是相似的&#xff0c;只是以 01字典树 的方式来维护值域。一般用来解决异或相关的能够按位贪心的题目。 其实就是将可持久化线段树中的操作嫁接到01Trie中&#xff0c;这样就是解决任意一个区间内的问题。 例题&…

AGC044E Pandom Pawn(期望+凸包)

最开始我们先旋转一下这张桌子&#xff0c;使得 A1An1max⁡{Ai}A_1A_{n1}\max\{A_i\}A1​An1​max{Ai​}。 这是非常有效的&#xff0c;因为我们把环就变成链&#xff0c;只要到达了链的任意一端 1/n11/n11/n1 就肯定会结束游戏。 定义 Ei:E_i:Ei​: 从 iii 开始游戏&#xf…