洛谷 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场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...
随机推荐
- 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换
总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...
- 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...
- RabbitMQ:从入门到搞定面试官
安装 使用docker安装,注意要安装tag后缀为management的镜像(包含web管理插件),我这里使用的是rabbitmq:3.8-management 1. 拉取镜像 shell docke ...
- Map中getOrDefault()与数值进行比较
一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...
- [对对子队]会议记录4.16(Scrum Meeting7)
今天已完成的工作 何瑞 工作内容:完成成本和分数系统 相关issue:实现成本和分数系统的逻辑 相关签入:4.16签入1 吴昭邦 工作内容:对接流水线和成本和分数系统 相关issu ...
- dwr简单应用及一个反向ajax消息推送
由于项目中最近需要用到dwr实现一些功能,因此在网上和dwr官网上找了一些资料进行学习.在此记录一下.(此处实现简单的dwr应用和dwr消息反向推送) 一.引入dwr的包 <dependency ...
- Python课程笔记(二)
1.格式化输出 print("%d %d %s" % (15, 3.14, 12.8)) 对比C语言 printf("%d,%d,%s",15, 3.14, 1 ...
- 如何系统学习C 语言(上)之 基础篇
大话C 语言(一) 初识C 语言 老实说,上大学之前我根本不知道什么是C 语言,所以当初学校开设这门课时,我是充满了好奇,所以当初我翻阅了大量的C 语言入门书籍,千篇一律,都是从一些概念.术语和理论讲 ...
- hdu 1503 Advanced Fruits(DP)
题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...
- Vue脚手架最新版本安装使用
现在很多的插件如Vant 这类的样式框架,都去兼容了Vue的3.0版本,所以我总结一下如何去简单的搭建一个Vue3.0的框架 开始 一,如何安装 在这里说明一下,Vue脚手架版本,和Vue版本是两个东 ...