P6860-象棋与马【欧拉函数,杜教筛】

出题人来报个到

正题

题目链接:https://www.luogu.com.cn/problem/P6860


题目大意

p(a,b)=1p(a,b)=1p(a,b)=1当且经当一只走a∗ba*bab矩形的马可以走到棋盘上任何一个点
∑a=1n∑b=1np(a,b)\sum_{a=1}^n\sum_{b=1}^np(a,b)a=1nb=1np(a,b)


解题思路

这个马能走到全图的充要条件显然是它能走到(0,1)(0,1)(0,1)。考虑给出(a,b)(a,b)(a,b)求它能否走到(0,1)(0,1)(0,1)

首先如果gcd(x,y)≠1gcd(x,y)\neq 1gcd(x,y)=1显然不行

因为走的顺序无所谓将走的路程分成两段,一段是(x±a,y±b)(x\pm a,y\pm b)(x±a,y±b),一段是(x±b,y±b)(x\pm b,y\pm b)(x±b,y±b)

显然对于第一段能走到的点可以表示为(2ax,2ay)(2ax,2ay)(2ax,2ay)(2ax+x,2ay+y)(2ax+x,2ay+y)(2ax+x,2ay+y)。第二段同理。

{2ax=2by2cy=2dx+1\left\{\begin{matrix} 2ax=2by \\ 2cy=2dx+1 \end{matrix}\right.{2ax=2by2cy=2dx+1

{2ax+x=2by2cy+y=2dx+1\left\{\begin{matrix} 2ax+x=2by \\ 2cy+y=2dx+1 \end{matrix}\right.{2ax+x=2by2cy+y=2dx+1

{2ax=2by+y2cy=2dx+x+1\left\{\begin{matrix} 2ax=2by+y \\ 2cy=2dx+x+1 \end{matrix}\right.{2ax=2by+y2cy=2dx+x+1

{2ax+x=2by+y2cy+y=2dx+x+1\left\{\begin{matrix} 2ax+x=2by+y \\ 2cy+y=2dx+x+1 \end{matrix}\right.{2ax+x=2by+y2cy+y=2dx+x+1

第一个我们有2(ax−by)=02(ax-by)=02(axby)=02(cy−dx)=12(cy-dx)=12(cydx)=1。因为x,yx,yx,y互质显然(ax−by)(ax-by)(axby)(cy−dx)(cy-dx)(cydx)都可以表示成任意整数。所有就有2k=02k=02k=02k=12k=12k=1,显然无解。

同理第二个可以推出2k+x=02k+x=02k+x=02k+y=12k+y=12k+y=1,就是xxx是偶数,yyy是奇数

第三个推出2k−y=02k-y=02ky=02k−x=12k-x=12kx=1,就是xxx是奇数,yyy是偶数

第四个是2k+x−y=02k+x-y=02k+xy=02k+y−x=12k+y-x=12k+yx=1,显然无解

也就是如果x+yx+yx+y是奇数,且gcd(x,y)=1gcd(x,y)=1gcd(x,y)=1那么有p(x,y)=1p(x,y)=1p(x,y)=1,直接可以计算答案,时间复杂度O(n2)O(n^2)O(n2)

定义w(x)w(x)w(x)表示1∼x1\sim x1x中与它互质且不是同奇偶的数的个数。若xxx是一个偶数,那么显然没有偶数和它互质那么有w(x)=φ(x)w(x)=\varphi(x)w(x)=φ(x),若xxx是奇数,那么对于每个偶数yyy和它互质也一定有一个对应的奇数x−yx-yxy和它互质,那么有w(x)=φ(x)2w(x)=\frac{\varphi(x)}{2}w(x)=2φ(x)。然后求和可以计算答案,时间复杂度O(n)O(n)O(n)

考虑如何用杜教筛优化,我们可以将问题转换为分开求奇数和偶数的φ\varphiφ和,对于每个偶数一定可以被表示为2k(k≤n2)2k(k\leq \frac{n}{2})2k(k2n),那么如何kkk是偶数就有φ(2k)=φ(k)\varphi(2k)=\varphi(k)φ(2k)=φ(k),如果kkk是奇数就有φ(2k)=2∗φ(k)\varphi(2k)=2*\varphi(k)φ(2k)=2φ(k),也就是如果求出1∼n21\sim \frac{n}{2}12n的奇偶的φ\varphiφ和就可以求出偶数的φ\varphiφ和,然后杜教筛减去求出奇数的,这是一个分治的过程,可以通过本题。

时间复杂度O(n23log⁡n)O(n^{\frac{2}{3}}\log n)O(n32logn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll unsigned long long
using namespace std;
const ll N=1e7+1;
ll T,n,cnt,mu[N],phi[N],pri[N];
ll sp1[N],sp2[N],p1[1100],p2[1100];
bool vis[N];
map<ll,ll> sp,sm; 
void prime(){phi[1]=1;for(ll i=2;i<N;i++){if(!vis[i])pri[++cnt]=i,phi[i]=i-1;for(ll j=1;j<=cnt&&pri[j]*i<N;j++){vis[pri[j]*i]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[pri[j]]*phi[i];}}for(ll i=1;i<N;i++){sp1[i]=sp1[i-1]+phi[i]*(i&1);sp2[i]=sp2[i-1]+phi[i]*(!(i&1));}return;
}
ll GetSphi(ll n){if(n<N)return sp1[n]+sp2[n];if(sp[n])return sp[n];ll rest=(n%2ull==0ull)?((ll)n/2ull*(n+1ull)):((ll)(n+1ull)/2ull*n);for(ll l=2ull,r;l<=n;l=r+1ull)r=n/(n/l),rest-=(r-l+1ull)*GetSphi(n/l);return (sp[n]=rest);
}
void dfs(ll x,ll n){p1[x]=p2[x]=0;if(n<N){p1[x]=sp1[n];p2[x]=sp2[n];return;}dfs(x+1,n/2);p2[x]+=p1[x+1]+p2[x+1]*2ull; p1[x]+=GetSphi(n)-p2[x];return;
}
int main()
{prime();scanf("%llu",&T);while(T--){scanf("%llu",&n);dfs(0,n);printf("%llu\n",p1[0]+p2[0]*2ull-1ull);}
}

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

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

相关文章

Codeforces Round #498 (Div. 3)

D. Two Strings Swaps 容易发现&#xff0c;a[i], a[n-i1], b[i], b[n-i1] 可以互相交换&#xff0c;且不会受其他地方影响&#xff0c;关键在于对于这4个字符怎们计算最小的操作数&#xff0c;讨论到死。。。看了别人的代码&#xff0c;用不同的字符对数表示字符的组成&#x…

用HttpClientFactory来实现简单的熔断降级

前言在2.1之后&#xff0c;有不少新东西&#xff0c;其中HttpClientFactory算是一个。HttpClientFactory涉及的东西也不算少&#xff0c;三四种clients , 请求中间件&#xff0c;与Polly的结合&#xff0c;生命周期等。Steeltoe的组件升级到2.1后&#xff0c;不少示例代码已经使…

【前缀和】【DP】登机(jzoj 5535)

登机 jzoj 5535 题目大意&#xff1a; 有一架飞机&#xff0c;有n个人要登机&#xff0c;每个人的不满值为登机时当前机舱在他所在行前方的人数总和&#xff0c;现在可以把飞机分为k个机舱&#xff0c;使不满值总和最小 原题&#xff1a; 题目描述 小H是机场登机的执行经…

后缀数组学习笔记

后缀数组学习笔记 说在前边 学习了《后缀数组——处理字符串的有力工具》终于感觉入门了&#xff0c;就总结一下&#xff0c;主要是应用原理讲解学习了 大佬Blog一些性质 height数组&#xff1a;定义height[i]suffix(sa[i-1])和suffix(sa[i])的最长公共前缀&#xff0c;也就是排…

CF140C-New Year Snowmen【优先队列】

正题 题目链接:https://www.luogu.com.cn/problem/CF140C 题目大意 nnn个雪球&#xff0c;一个雪人需要用333个不同大小的雪球堆起&#xff0c;求最多雪人。 解题思路 我们每次拿相同雪球中最多的三个来堆即可&#xff0c;用优先队列维护。 时间复杂度O(nlog⁡n)O(n\log n)O…

基于.net standard 的动态编译实现

在前文[基于.net core 微服务的另类实现]结尾处&#xff0c;提到了如何方便自动的生成微服务的客户端代理&#xff0c;使对于调用方透明&#xff0c;同时将枯燥的东西使用框架集成&#xff0c;以提高使用便捷性。在尝试了基于 Emit 中间语言后&#xff0c;最终决定使用生成代码…

线段树动态开点区间加区间求和

线段树动态开点区间加区间求和 题目来源&#xff1a; 陕西师范大学第七届程序设计竞赛网络同步赛 H. 万恶的柯怡 思想&#xff1a; 保证叶子节点被完整的覆盖&#xff0c;需要开节点&#xff0c;就把左右儿子都开出来&#xff0c;其余和普通线段树一样。 tips&#xff1a; 用结…

初一模拟赛总结(6.6 my brother高考前一天,加油!(。・`ω´・。))

成绩&#xff1a; 注&#xff1a;rankrankrank是有算其他$dalao的 T1T1T1好像因为精度问题被卡了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky180180180100100100000808080000222whdwhdwhd130130130100100100000202020101010222lyflyflyf13…

P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P1337 题目大意 nnn个点有重量wiw_iwi​&#xff0c;求重心。 解题思路 模拟退火随机找一个重心然后不断接近即可。 codecodecode #include<cstdio> #include<cstring> #include<algorithm> #include<…

基于阿里云 DNS API 实现的 DDNS 工具

0.简要介绍0.1 思路说明AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具&#xff0c;借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能。工具核心就是调用了阿里云 DNS 的两个 API &#xff0c;一个 API 获取指定域名的所有解析记录&#xff0c;然后通过比对与当前…

【拓扑排序】【DP】奖金(ssl 1325)

奖金 ssl 1325 题目大意&#xff1a; 有n个人&#xff0c;某个人要比另外一个人的工资高&#xff08;工资最低为100&#xff0c;最少多1元&#xff09;&#xff0c;问最少发多少工资 原题&#xff1a; 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出&#x…

网络流24题

网络流24题 说在前边 一直没有完整的刷过这套题&#xff0c;打算最近一点点刷掉通过《最小割模型在信息学竞赛中的应用》及《浅析一类最小割问题》学习常规建图技巧飞行员配对方案问题 二分图最大匹配 #include <bits/stdc.h> typedef long long ll; const int inf 0x3f…

P3959-宝藏【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P3959 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;求一棵有根生成树权值最小。对于一条边(fa,x,w)(fa,x,w)(fa,x,w)会产生权值depfa∗wdep_{fa}*wdepfa​∗w。 解题思路 我们模拟退火每次随机一个序列&#xff0c;然后…

ASP.NET Core Web API 集成测试中使用 Bearer Token

在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, 例如里面去掉了用户身份验证相关的中间件.但是有些被测试的行为里面需要用到身份/授权信息.所以本文就介绍一下在API集成…

桐桐的雷达

桐桐的雷达 题目大意&#xff1a; 有一堆数字&#xff0c;并给出一个范围&#xff0c;判断不在范围内的数字是否多过10%&#xff0c;若不多过&#xff0c;那输出范围内数字的平均值 原题&#xff1a; 题目描述 桐桐在去广州的路上&#xff0c;对高速公路上的测速雷达产生了…

Codeforces Round #497 (Div. 1)

Codeforces Round #497 (Div. 1) A. Reorder the Array 先满足数值较小的位置&#xff0c;每次找恰好大于这个值的一个值即可。 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define pb push_back typedef long long ll; const int N 100200; usin…

jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

正题 题目大意 开始暴击率为xxx&#xff0c;每次失败后都会增加xxx&#xff0c;成功后重置&#xff0c;然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ansansans为期望攻击多少次后暴击&#xff0c;然后答案为1ans\frac{1}{ans}ans1​。…

【模拟】桐桐的游戏

桐桐的游戏 题目大意&#xff1a; 有一个用数组成的环要从1跳到z&#xff08;有些点不能跳&#xff09;&#xff0c;每次跳的步数最少有多少步 原题&#xff1a; 题目描述 桐桐最近在玩一个跳棋游戏&#xff0c;规则是&#xff1a;有个圆圈&#xff0c;分成N等分&#xff…

ASP.NET Core 应用发布与部署指南

一、前言本篇主要包含哪些内容&#xff1f;将项目发布到本地目录将项目传输到服务器并配置启动&开机自动启动将Nginx作为访问入口&#xff0c;配置反向代理本篇环境信息开发环境&#xff1a;用途工具&版本操作系统Windows 10开发工具Visual Studio 2017&#xff08;15.…

jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

正题 题目大意 n∗nn*nn∗n的矩形&#xff0c;每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上。如果没有就失败了&#xff0c;求必胜方。 解题思路 如果场地上有一个位置堵上后即可堵上所有k∗kk*kk∗k的矩形那么这个点被堵住后就赢了&#xff0c;…