描述

给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边。有Q个询问,每个询问包含两个数x和y,求x到y的最短距离。

输入格式

第一行包含两个用空格隔开的整数,N和Q。
接下来Q行,每行两个数x和y。

输出格式

输出Q行整数,表示从x到y的最短距离。

样例输入

6 2
4 6
2 5

样例输出

2
2

数据范围与约定

  • 对于30%的数据,1<=N<=100。
  • 对于70%的数据,1<=N<=10^5。
  • 对于100%的数据,1<=N<=10^7,1<=x,y<=N,Q<=10^5。

题解:
忽然发现,求1-n的质因数分解的和是可以线性筛的,怒赞!
为何不卡我们这些q*sqrt(n)的?出题人良心,好评!!!
代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 10000000+1000

 #define maxm 500+100

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,m,tot,p[maxn],f[maxn];
bool check[maxn];
inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
void get()
{
f[]=;tot=;
for2(i,,n)
{
if(!check[i]){p[++tot]=i;f[i]=i;};
for1(j,tot)
{
int k=p[j]*i;
if(k>n)break;
check[k]=;
f[k]=f[i]+p[j];
if(i%p[j]==)break;
}
}
} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();get();
while(m--)
{
int x=read(),y=read();
if(x==y){printf("0\n");continue;};
printf("%d\n",f[x/gcd(x,y)]);
} return ; }

补一下为什么质因数分解就是ans

假设求x->y的最短路,则直接走 这条路  长度为x/gcd(x,y)设这个长度的质因数分解为a1*a2*a3*a4……(两项可以相等)

然后要用到一个结论:

若a>=2,b>=2,则a+b<=a*b

移项就是 (1-a)*(1-b)>=1  这是显然的。

所以我们不妨把这个长度分开来走,

因为每拆一项都会使答案减小或不边,那我们不妨直接将该数全部分解为质数,一个一个质数来走。

举个例子

100-1,则100/gcd(100,1)的质因数分解为2*2*5*5

我们不妨使每次走的长度为2 2 5 5,而2+2+5+5=14<100 这样使长度之和达到最小。

所以我们可以这样走 100->50->25->5->1->1

有没有更短的路径呢?严格证法还待yy,不过貌似直觉上是显然的?

CH Round #53 -GCD Path的更多相关文章

  1. CH Round #53 -【Nescafé 32】杯NOIP模拟赛

    A.GCD Path http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D ...

  2. CH Round #53 -密室

    描述 有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉.每个密室由一扇门 ...

  3. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  4. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  5. CH Round #72树洞[二分答案 DFS&&BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  6. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  7. contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve

    http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...

  8. CH Round #17 舞动的夜晚

    舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...

  9. CH Round #45 能量释放

    能量释放 CH Round #45 - alan有一些陷阱 III 题目描述 alan得到一块由个能量晶体构成的矿石,对于矿石中的每一个能量晶体,如果用化学物质刺激某一个能量晶体,就能使它释放能量. ...

随机推荐

  1. convert app to 64-bit for ios7

    https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Introd ...

  2. python遗传算法实现数据拟合

    python据说功能强大,触角伸到各个领域,网上搜了一下其科学计算和工程计算能力也相当强,具备各种第三方包,除了性能软肋外,其他无可指摘,甚至可以同matlab等专业工具一较高下. 从网上找了一个使用 ...

  3. grouth:全栈工程师指南

    语言学习 curl -v baidu.com 域名请求DNS服务器得到网站服务器的IP,http是80端口,https是443端口.查到ip拿到HTML,JS,CSS后就开始渲染这个页面了. 1.Pa ...

  4. Android开发之发送短信

    本实例通过SmsManager的sendTextMessage方法实现发送短信关于SmsManager的具体解释大家能够參照:Android开发之SmsManager具体解释 实例执行效果图: 程序代 ...

  5. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  6. 结合tcpdump命令对traceroute深入分析

    昨天突然被问到traceroute的原理,一时竟也说不出来,有些命令平时虽然经常在用,但实际原理确并不了解,趁这次机会就来梳理一下. traceroute:是网络诊断中,用来分析IP包经过那些路由的命 ...

  7. python模块基础之getpass模块

    getpass模块提供了可移植的密码输入,一共包括下面两个函数: 1. getpass.getpass() 2. getpass.getuser() getpass.getpass([prompt[, ...

  8. saltstack对递归依赖条件(死循环依赖)的处理

    本文将对saltstack中状态文件中require条件产生死循环的情形进行简单的测试和分析 测试思路: 写一个包含递归依赖条件的状态文件,进行测试:      A依赖于B      B依赖于C    ...

  9. HTML5和CSS3实例教程[总结二]

    基于contenteditable属性实现在位编辑 HTML5规范引入了contenteditable属性,它几乎可以用在任何元素上,只要添加这一属性 即可变为可编译区域 <!DOCTYPE h ...

  10. 毕业设计 ASP.Net+EasyUI开发 X X露天矿调度管理信息系统(二)

    这是本毕业设计的雏形和框架,实现的功能在左侧的功能框导航菜单内.  做的太烂,还是把学校名字给马赛克掉吧....省的挨校友批 登陆界面.. <cookie +ispostback实现记住我功能& ...