洛谷 P6860 - 象棋与马(找性质+杜教筛)
首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\)。不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到达,将坐标轴旋转一下 \((0,1)\) 也能到达,因此对于坐标系中任意一点 \((x,y)\),重复 \(x\) 次 \((0,0)\to(1,0)\) 的过程,再重复 \(y\) 次 \((0,0)\to(0,1)\) 的过程就能够到达 \((x,y)\)。
其次,注意到本质不同的移动向量只有四个,即 \((a,b),(b,a),(-a,b),(-b,a)\),我们假设这四个向量分别移动了 \(x,y,z,w\) 次(注意,这边 \(x,y,z,w\) 不一定要 \(\ge 0\),如果 \(x<0\) 则表示沿着 \((-a,-b)\) 向量移动了 \(-x\) 次,很好理解),那么能够到达 \((1,0)\) 的充要条件就是 \(\exists x,y,z,w\in\mathbb{Z},\begin{cases}ax+by-az-bw=1\\bx+ay+bz+aw=0\end{cases}\),上下两式相加可得 \((a+b)(x+y)+(a-b)(w-z)=1\),上下两式相减可得 \((a-b)(x-y)-(a+b)(z+w)=1\),发现都可以转化为 \((a-b)x+(a+b)y=1\) 的方程,根据斐蜀定理知该方程存在整数解的充要条件为 \(\text{gcd}(a-b,a+b)=1\),显然若 \(\text{gcd}(a,b)>1\) 就无解了,并且如果 \(a\equiv b\pmod{2}\) 也无解,因为 \(a-b,a+b\) 都是 \(2\) 的倍数。否则显然有 \(\gcd(a,a+b)=1\),而由 \(2\nmid a+b\) 可知 \(\gcd(2a,a+b)=1\),再辗转相除一下可得 \(\gcd(a-b,a+b)=1\),当然这只是说明了方程 \((a-b)x+(a+b)y=1\) 有解,不能保证一定存在符合要求 \(x,y,z,w\),不过我们仔细想想,我们由于 \(a\not\equiv b\pmod{2}\),必然有 \(a+b\equiv a-b\equiv 1\pmod{2}\),因此我们构造出的解 \(x_0,y_0\) 显然满足 \(x_0\not\equiv y_0\pmod{2}\),而显然同余方程组还存在一组解 \((x_0-(a-b),y_0-(a+b))\),因此我们考虑令 \(\begin{cases}x+y=y_0\\x-y=x_0-(a-b)\\w-z=x_0\\w+z=(a+b)-y_0\end{cases}\),那么显然 \(y_0\) 与 \(x_0-(a-b)\)、\(x_0\) 与 \((a+b)-y_0\) 都是同奇偶的,因此就存在符合要求的 \(x,y,z,w\) 了,综上我们得出了结论 \(p(a,b)=[\gcd(a,b)=1\land 2\nmid a+b]\)。
接下来考虑计算答案,显然答案等于 \(2\sum\limits_{a\text{为奇数}}\sum\limits_{b<a\text{且}b\text{为偶数}}[\gcd(a,b)=1]+2\sum\limits_{a\text{为偶数}}\sum\limits_{b<a\text{且}b\text{为奇数}}[\gcd(a,b)=1]\),考虑对于一个固定的 \(a\) 的贡献,显然若 \(a\) 为偶数,那么所有 \(<a\) 且与 \(a\) 互质的数都是奇数,贡献为 \(\varphi(a)\),否则贡献就是所有 \(<a\) 且与 \(a\) 互质的偶数,显然对于所有与 \(a\) 互质的偶数 \(x\) 都有 \(\gcd(a,a+x)=1\),而由 \(a+x\) 为奇数可知 \(\gcd(2a,a+x)=1\),并且所有 \(<2a\) 且与 \(2a\) 互质的数 \(v\) 都有 \(v-a\) 为偶数,因此 \(x\) 的个数就是在 \([a,2a)\) 中且与 \(2a\) 互质的数的个数,这个显然等于 \(\dfrac{\varphi(2a)}{2}\),而显然 \(\varphi(2a)=\varphi(a)\),故这个值就等于 \(\dfrac{\varphi(a)}{2}\),因此我们要求的值就是 \([1,n]\) 中所有奇数的 \(\varphi\) 值与所有偶数 \(\varphi\) 值的两倍的和,我们考虑先求 \([1,n]\) 中所有 \(\varphi(i)\) 的和,这样会少算一遍偶数的 \(\varphi(i)\) 的贡献,考虑这个漏算贡献怎么计算,注意到对于 \([1,n]\) 中的某个偶数 \(x\),若 \(\dfrac{x}{2}\) 为奇数则 \(\varphi(x)=\varphi(\dfrac{x}{2})\),否则 \(\varphi(x)=2\varphi(\dfrac{x}{2})\),因此漏算的贡献恰好又是 \([1,\dfrac{n}{2}]\) 中所有奇数的 \(\varphi\) 值与所有偶数 \(\varphi\) 值的两倍的和,递归计算即可。
最后,此题数据范围高达 \(10^{11}\),因此需用杜教筛求出 \(\varphi(x)\) 的前缀和,这个知识点大约是我半年前学的了罢,现在已经几乎忘掉了,所以感谢这道题让我回忆起了遗忘的知识点。根据狄利克雷卷积有 \(\varphi*I=id\),考虑 \(id(x)\) 的前缀和 \(\sum\limits_{i=1}^nid(i)\),我们将每个 \(id(i)\) 都写成关于 \(\varphi(x)\) 的求和式,即 \(\sum\limits_{i=1}^nid(i)=\sum\limits_{i=1}^n\sum\limits_{j|i}\varphi(j)\),交换求和号,先枚举 \(j\) 可得 \(\sum\limits_{i=1}^nid(i)=\sum\limits_{j=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{j}\rfloor}\varphi(i)\),将 \(j=1\) 单独提出来可得 \(\sum\limits_{i=1}^nid(i)=\sum\limits_{i=1}^n\varphi(i)+\sum\limits_{j=2}^n\sum\limits_{i=1}^{\lfloor\frac{n}{j}\rfloor}\varphi(i)\),记 \(\varphi_s(n)=\sum\limits_{i=1}^n\varphi(i)\),那么 \(\sum\limits_{i=1}^nid(i)=\varphi_s(n)+\sum\limits_{j=2}^n\varphi_s(\lfloor\dfrac{n}{j}\rfloor)\),前面 \(\sum\limits_{i=1}^nid(i)\) 显然等于 \(\dfrac{n(n+1)}{2}\),后面 \(\sum\limits_{j=2}^n\varphi_s(\lfloor\dfrac{n}{j}\rfloor)\) 整除分块递归处理即可,根据 P6788 这样整除分块套整除分块复杂度是 \(n^{3/4}\) 的,不过预处理 \([1,n^{2/3}]\) 的 \(\varphi_s(n)\) 可将复杂度降到 \(n^{2/3}\)。
最后此题有一个坑点,就是在求 \(id(n)\) 的前缀和 \(\dfrac{n(n+1)}{2}\) 不能直接写 1ull*n*(n+1)/2,因为对于 \([0,2^{64})\) 的整数 \(v\),在 \([0,2^{64})\) 中存在两个整数 \(x\) 满足 \(2x\equiv v\pmod{2^{64}}\),而你这样直接除就默认是 \(<2^{63}\) 的那个 \(x\) 了,会出问题,正确写法是分 \(n\) 为奇数和偶数分别处理,先除再乘(NOIP2020 悲惨回忆),这样就不会出问题了。
const int MAXV=2e7;
int phi[MAXV+5],pr[MAXV/10+5],prcnt=0;
u64 sum[MAXV+5];bitset<MAXV+5> vis;
void sieve(int n){
	phi[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i]){pr[++prcnt]=i;phi[i]=i-1;}
		for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
			vis[pr[j]*i]=1;
			if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}
			else phi[i*pr[j]]=phi[i]*phi[pr[j]];
		}
	}
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
}
unordered_map<ll,u64> mem;
u64 getsum(ll n){
	if(n<=MAXV) return sum[n];
	if(mem[n]) return mem[n];
	u64 ret;
	if(n%2) ret=1ull*(n+1)/2*n;
	else ret=1ull*n/2*(n+1);
	for(ll l=2,r;l<=n;l=r+1){
		r=(n/(n/l));ret-=1ull*getsum(n/l)*(r-l+1);
	} return mem[n]=ret;
}
u64 solve(ll n){
	if(n==1) return 0;
	return solve(n/2)+getsum(n);
}
int main(){
	sieve(MAXV);int qu;scanf("%d",&qu);
	while(qu--){ll n;scanf("%lld",&n);printf("%llu\n",solve(n));}
	return 0;
}
												
											洛谷 P6860 - 象棋与马(找性质+杜教筛)的更多相关文章
- HDU 6987 - Cycle Binary(找性质+杜教筛)
		
题面传送门 首先 mol 一发现场 AC 的 csy 神仙 为什么这题现场这么多人过啊啊啊啊啊啊 继续搬运官方题解( 首先对于题目中的 \(k,P\),我们有若存在字符串 \(k,P,P'\) 满 ...
 - 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
		
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
 - 【洛谷 5002】专心OI - 找祖先 (树上计数)
		
专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这 ...
 - Solution -「LGR-087」「洛谷 P6860」象棋与马
		
\(\mathcal{Description}\) Link. 在一个 \(\mathbb R^2\) 的 \((0,0)\) 处有一颗棋子,对于参数 \(a,b\),若它当前坐标为 \((x ...
 - 【树链剖分/倍增模板】【洛谷】3398:仓鼠找sugar
		
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
 - 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]
		
题目传送门 荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马 ...
 - 洛谷——P1626 象棋比赛
		
P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...
 - 洛谷 P2168 [NOI2015]荷马史诗 解题报告
		
P2168 [NOI2015]荷马史诗 题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷 ...
 - 洛谷 P1626 象棋比赛
		
P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...
 
随机推荐
- [技术博客] 通过ItemTouchHelper实现侧滑删除功能
			
通过ItemTouchHelper实现侧滑删除功能 一.效果 二.具体实现 demo中演示的这种左滑删除的效果在手机APP中比较常用,安卓也为我们提供了专门的辅助类ItemTouchHelper来帮助 ...
 - Docker制作能够ssh连接的镜像
			
本类文章只作为记录使用 命令操作: #拉取Centos 7 docker pull centos:7 #运行一个镜像 docker run -tdi --privileged centos:7 ini ...
 - jQuery根据地址获取经纬度
			
一.HTML部分 1 @*景区位置*@ 2 <tr> 3 <th>景区名称:</th> 4 <td><input class="txt ...
 - (三)FastDFS 高可用集群架构学习---Client 接口开发
			
一.Python3 与 FastDFS 交互 1.安装 py3fdfs模块 # pip3 install py3Fdfs 2.测试使用 py3Fdfs 与 Fastdfs 集群交互(上传文件) fro ...
 - Centos 7 局域网 yum 源搭建
			
一.需求及实现方式介绍: 需求:现在各个软件版本更新迭代很快,在我们部署一套集群(比如:openstack)后,如果过一段时间想扩展集群时发现软件版本早已迭代更新,安装后导致和现有环境或多或少不兼容, ...
 - 编译安装与gcc编译器
			
先说一下gcc编译器,只知道这是一个老款的编译器.编译的目的也比较重要,就是将c语言的代码编译成可以执行的binary文件. gcc 简单使用(后期补充) eg: gcc example.c # ...
 - 算法学习->求解三角形最小路径及其值
			
00 问题 00-1 描述 对给定高度为n的一个整数三角形,找出从顶部到底部的最小路径和.每个整数只能向下移动到与之相邻的整数. 找到一个一样的力扣题:120. 三角形最小路径和 - 力扣(LeetC ...
 - 【Go语言学习笔记】Go的defer
			
关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行. 注意,defer语句只能出现在函数或方法的内部. defer语句经常被用于处理成对的操作,如打开.关闭.连接.断开连接 ...
 - k8s之mutating webhook + gin
			
1.知识准备 1.Webhook 是一种用于接收准入请求并对其进行处理的 HTTP 回调机制 2.Webhook 接收来自apiserver的回调,对回调资源做一些校验.注入.修改元数据等工作 3.来 ...
 - 详解calc()函数功能
			
calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性 ...