[luogu6860]象棋与马
根据扩欧$(a,b)=1$必须要满足,同时,若$a+b$为偶数则格子的”奇偶性“不变,因此$a+b$必须为奇数
反过来,容易证明满足$(a,b)=1$且$a+b$为奇数则一定可行(构造从$(0,0)$到$(0,1)$的一组解即可)
不妨假设$a$为奇数、$b$为偶数(答案再乘以2),分两类考虑:
1.$a<b$,显然与$b$互素的数必然是奇数,因此即$\sum_{2i\le n}\varphi(2i)$
2.$a>b$,由于$(a,b)=1$等价于$(a,a-b)=1$,因此每一个小于$a$且与$a$互素的奇数与另一个偶数对应,因此即$\sum_{2i+1\le n}\frac{\varphi(2i+1)}{2}$
不妨先把答案的2乘进去,那么即$f_{n}=\sum_{i=1}^{n}\varphi(i)+\sum_{2i\le n}\varphi(2i)$(偶数要算两次)
根据积性或$\varphi$的计算过程,若$i$为奇数,则有$\varphi(2i)=\varphi(i)$,若$i$为偶数,则$\varphi(2i)=2\varphi(i)$
对于$\sum_{2i\le n}\varphi(2i)$,对$i$的奇偶性分类讨论,即$\sum_{2i\le n}\varphi(2i)=\sum_{4i\le n}\varphi(2i)+\sum_{4i+2\le n}\varphi(2i+1)=f_{\frac{n}{2}}$
根据$f_{n}=\sum_{i=1}^{n}\varphi(i)+f_{\frac{n}{2}}$,再用杜教筛优化,时间复杂度可以做到$o(Tn^{\frac{2}{3}}\log_{2}n)$,可以通过


- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 #define N 40000005
- 4 #define ull unsigned long long
- 5 int t,vis[N],p[N];
- 6 ull n,ans,phi[N];
- 7 map<ull,ull>mat;
- 8 ull calc(ull n){
- 9 if (n<N-4)return phi[n];
- 10 if (mat[n])return mat[n];
- 11 ull ans;
- 12 if (n&1)ans=(n+1)/2*n;
- 13 else ans=n/2*(n+1);
- 14 for(ull i=2,j;i<=n;i=j+1){
- 15 j=n/(n/i);
- 16 ans-=(j-i+1)*calc(n/i);
- 17 }
- 18 return mat[n]=ans;
- 19 }
- 20 int main(){
- 21 phi[1]=1;
- 22 for(int i=2;i<N-4;i++){
- 23 if (!vis[i]){
- 24 p[++p[0]]=i;
- 25 phi[i]=i-1;
- 26 }
- 27 for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
- 28 vis[i*p[j]]=1;
- 29 if (i%p[j])phi[i*p[j]]=phi[i]*phi[p[j]];
- 30 else{
- 31 phi[i*p[j]]=phi[i]*p[j];
- 32 break;
- 33 }
- 34 }
- 35 }
- 36 for(int i=2;i<N-4;i++)phi[i]=phi[i]+phi[i-1];
- 37 scanf("%d",&t);
- 38 while (t--){
- 39 scanf("%llu",&n);
- 40 ans=0;
- 41 while (n>1){
- 42 ans+=calc(n);
- 43 n/=2;
- 44 }
- 45 printf("%llu\n",ans);
- 46 }
- 47 }
[luogu6860]象棋与马的更多相关文章
- 洛谷 P6860 - 象棋与马(找性质+杜教筛)
题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...
- Solution -「LGR-087」「洛谷 P6860」象棋与马
\(\mathcal{Description}\) Link. 在一个 \(\mathbb R^2\) 的 \((0,0)\) 处有一颗棋子,对于参数 \(a,b\),若它当前坐标为 \((x ...
- hdu1372 dfs搜索之国际象棋的马
原题地址 题意 一个8x8的国际象棋棋盘,你有一个棋子"马".算出棋子"马"从某一格到还有一格子的最少步数. 与普通dfs不同的是,你能走的路线不是上下左右,四 ...
- 【算法】深度优先 马走日 Hamilton routes
在n*m的棋盘中,马只能走“日” 字.马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次.找出所有路径. ××××××××××××× 类似问题: 在半个中国象棋棋盘上,马在左下角(1,1)处 ...
- uva-439
题意:骑士在一个8*8的棋盘上移动,1-8代表行号,a-h代表列号,给出骑士的初始位置和目的位置,求骑士最少的移动步数:题目隐含一层意思(骑士移动规则是中国象棋的“马”的走法) 输入:一串字符串,包含 ...
- UML从需求到实现---类图(1)
上次写到了UML的包图,用例等:接上:UML从需求到实现---包图 按照UML中图的出现顺序.当做完包图以后.我们下一步要做的当然是类图,类图也是UML中的三大核心图之一. 看到很多文章在描述类图的时 ...
- TYVJ P1074 武士风度的牛 Label:跳马问题
背景 农民John有很多牛,他想交易其中一头被Don称为The Knight的牛.这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法).虽然这头神奇的牛不能跳到 ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- UVA Knight Moves
题目例如以下: Knight Moves A friend of you is doing research on the Traveling Knight Problem (TKP) where ...
随机推荐
- 创建HTML文档
目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...
- [源码解析]PyTorch如何实现前向传播(1) --- 基础类(上)
[源码解析]PyTorch如何实现前向传播(1) --- 基础类(上) 目录 [源码解析]PyTorch如何实现前向传播(1) --- 基础类(上) 0x00 摘要 0x01 总体逻辑 0x02 废弃 ...
- flask 之 请求钩子
请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...
- 【UE4】GAMES101 图形学作业2:光栅化和深度缓存
总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...
- 通过Nacos动态刷新Spring Cloud Gateway的路由
通过Nacos动态刷新Spring Cloud Gateway的路由 一.背景 二.解决方案 三.实现功能 四.实现步骤 1.网关服务的实现 1.pom文件 2.bootstrap.yml配置文件 3 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...
- Django(71)图片处理器django-imagekit
介绍 ImageKit是用于处理图像的Django应用程序.如果需要从原图上生成一个长宽为50x50的图像,则需要ImageKit. ImageKit附带了一系列图像处理器,用于调整大小和裁剪等常见任 ...
- 注意 .NET string.GetHashCode() 用法
需求案例:需要把字符串存入数据库,并且要求数据库中不能有重复的字符串,由此就引出了将字符串hash成特定的hash值,依靠查询hash值是否重复来判断字符串是否重复.这样做的好处在于查询重复字符串的代 ...
- 跳台阶 牛客网 剑指Offer
跳台阶 牛客网 剑指Offer 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). class Solution: #ru ...
- JAVA笔记__窗体类/Panel类/Toolkit类
/** * 窗体类 */ public class Main { public static void main(String[] args) { MyFrame m1 = new MyFrame() ...