描述

给定一张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. DLL模块:extern "C"的简单解析

    1.揭密extern "C" extern "C"包含双重含义,从字面上即可得到:首先,被它修饰的目标是 "extern”的:其次,被它修饰的目标是 ...

  2. 深入理解linux网络技术内幕读书笔记(八)--设备注册与初始化

    Table of Contents 1 设备注册之时 2 设备除名之时 3 分配net_device结构 4 NIC注册和除名架构 4.1 注册 4.2 除名 5 设备初始化 6 设备类型初始化: x ...

  3. AngularJS和ReactJS对比

    Angular的特点: 优势: AngularJS是一套完整的框架,angular有自带的数据绑定.render渲染.angularUI库,过滤器,$filter,$directive(模板),$se ...

  4. 关于springMVC框架访问web-inf下的jsp文件

    问题:springMVC框架访问web-inf下的jsp文件,具体如下: 使用springMVC,一般都会使用springMVC的视图解析器,大概会这样配置 <property name=&qu ...

  5. es6新特性:

    http://es6katas.org/ es6+一些新特性,截图如下 对应方法,函数显示相关的数据,如图: 对应方法,函数的例子,如下

  6. Agile 敏捷开发

    简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项目分为多个相互联 ...

  7. [Angular 2] Async Http

    Async Pipe: The Asynce pipe receive a Promise or Observable as  input and subscribes to the input, e ...

  8. 一些使用Android设备调试功能的注意事项(挖职位)

    华为3C Activity切换动画过热. 当显示器是不是大图easy显现OOM(应用最大大于其他手机内容).因此,调试OOM不要当问题用这个手机,否则,很难发现问题. 小米3 不要调用系统的裁图功能. ...

  9. Gcc简介与常用命令

    一.对于GUN编译器来说,程序的编译要经历预处理.编译.汇编.连接四个阶段,如下图所示: 在预处理阶段,输入的是C语言的源文件,通常为*.c.它们通常带有.h之类头文件的包含文件.这个阶段主要处理源文 ...

  10. Spring 详解第一天

    spring 框架简述: http://www.cnblogs.com/ToBeAProgrammer/p/5230065.html http://www.cnblogs.com/ToBeAProgr ...