题面传送门

首先我们来探究一下什么样的 \((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 - 象棋与马(找性质+杜教筛)的更多相关文章

  1. HDU 6987 - Cycle Binary(找性质+杜教筛)

    题面传送门 首先 mol 一发现场 AC 的 csy 神仙 为什么这题现场这么多人过啊啊啊啊啊啊 继续搬运官方题解( 首先对于题目中的 \(k,P\)​,我们有若存在字符串 \(k,P,P'\)​ 满 ...

  2. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  3. 【洛谷 5002】专心OI - 找祖先 (树上计数)

    专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这 ...

  4. Solution -「LGR-087」「洛谷 P6860」象棋与马

    \(\mathcal{Description}\)   Link.   在一个 \(\mathbb R^2\) 的 \((0,0)\) 处有一颗棋子,对于参数 \(a,b\),若它当前坐标为 \((x ...

  5. 【树链剖分/倍增模板】【洛谷】3398:仓鼠找sugar

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  6. 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]

    题目传送门 荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马 ...

  7. 洛谷——P1626 象棋比赛

    P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...

  8. 洛谷 P2168 [NOI2015]荷马史诗 解题报告

    P2168 [NOI2015]荷马史诗 题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷 ...

  9. 洛谷 P1626 象棋比赛

    P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...

随机推荐

  1. Vue2源码解读 - 响应式原理及简单实现

    直接进入主题了,想必大家都知道实现vue响应式核心方法就是 Object.defineProperty,那就从它开始说 Object.defineProperty 缺点: 深度监听,需要递归到底,一次 ...

  2. 【c++ Prime 学习笔记】第5章 语句

    C++提供了一组控制流语句,包括条件执行语句.循环语句.跳转语句. 5.1 简单语句 空语句 ; ,最简单的语句 别漏写分号,也别多写 while(cin>>s && s! ...

  3. 23.合并k个有序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  4. BPMN 學習實例

    什麼是業務流程圖? What is BPMN 業務流程建模符號(BPMN)是業務流程建模的一種方法.它基於統一建模語言(UML)中活動圖的概念,以圖形符號(業務流程圖)支持業務流程的規範.BPMN為企 ...

  5. [软工顶级理解组] 团队规划和任务拆解(Beta)

    目录 需求再分析 功能增减 管理改进 任务分解 人员管理 需求再分析 在Alpha阶段,我们的产品得到了用户的广泛好评,但是还是存在一些问题. 登录不稳定,登录速度慢等问题:这是北航VPN本身的不稳定 ...

  6. 【二食堂】Beta - 事后分析

    事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? Beta阶段我们首先要对文本标注方式进行优化,其次时添加好友系统,实现邀请好友共同标注的功能. ...

  7. Scrum Meeting 0505

    零.说明 日期:2021-5-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成邮箱注册页面功 ...

  8. BUAA-软件工程-个人总结与心得

    提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...

  9. vue混入mixin的使用,保证你看的明明白白!

    场景描述 有些时候,我们发现有些组件部分功能代码是几乎是一样的. 这个时候,我们就可以将相同的逻辑代码抽离出来 此时我们的主角混入mixin就登场了 下面我们有a-test和b-test两个组件,点击 ...

  10. Downward API —— 在容器内部获取 Pod 信息

    我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字.IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢? 答案就是使用 ...