https://codeforces.com/contest/1143/problem/D

D. The Beatles
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Recently a Golden Circle of Beetlovers was found in Byteland. It is a circle route going through n⋅kn⋅k cities. The cities are numerated from 11to n⋅kn⋅k, the distance between the neighboring cities is exactly 11 km.

Sergey does not like beetles, he loves burgers. Fortunately for him, there are nn fast food restaurants on the circle, they are located in the 11-st, the (k+1)(k+1)-st, the (2k+1)(2k+1)-st, and so on, the ((n−1)k+1)((n−1)k+1)-st cities, i.e. the distance between the neighboring cities with fast food restaurants is kk km.

Sergey began his journey at some city ss and traveled along the circle, making stops at cities each ll km (l>0l>0), until he stopped in ss once again. Sergey then forgot numbers ss and ll, but he remembers that the distance from the city ss to the nearest fast food restaurant was aakm, and the distance from the city he stopped at after traveling the first ll km from ss to the nearest fast food restaurant was bb km. Sergey always traveled in the same direction along the circle, but when he calculated distances to the restaurants, he considered both directions.

Now Sergey is interested in two integers. The first integer xx is the minimum number of stops (excluding the first) Sergey could have done before returning to ss. The second integer yy is the maximum number of stops (excluding the first) Sergey could have done before returning to ss.

Input

The first line contains two integers nn and kk (1≤n,k≤1000001≤n,k≤100000) — the number of fast food restaurants on the circle and the distance between the neighboring restaurants, respectively.

The second line contains two integers aa and bb (0≤a,b≤k20≤a,b≤k2) — the distances to the nearest fast food restaurants from the initial city and from the city Sergey made the first stop at, respectively.

Output

Print the two integers xx and yy.

Examples
input
2 3
1 1
output
1 6
input
3 2
0 0
output
1 3
input
1 10
5 3
output
5 5
Note

In the first example the restaurants are located in the cities 11 and 44, the initial city ss could be 22, 33, 55, or 66. The next city Sergey stopped at could also be at cities 2,3,5,62,3,5,6. Let's loop through all possible combinations of these cities. If both ss and the city of the first stop are at the city 22 (for example, l=6l=6), then Sergey is at ss after the first stop already, so x=1x=1. In other pairs Sergey needs 1,2,31,2,3, or 66 stops to return to ss, so y=6y=6.

In the second example Sergey was at cities with fast food restaurant both initially and after the first stop, so ll is 22, 44, or 66. Thus x=1x=1, y=3y=3.

In the third example there is only one restaurant, so the possible locations of ss and the first stop are: (6,8)(6,8) and (6,4)(6,4). For the first option l=2l=2, for the second l=8l=8. In both cases Sergey needs x=y=5x=y=5 stops to go to ss.

题意:有一个总长度为n*K的环,每隔K有一个饭店,你的初始位置不知道,只知道你初始位置距离最近的饭店距离为 A,你每次移动L米然后停下来,但是L也未知,但是知道你第一次停下来距离你最近的饭店距离为B,你再次停在初始位置时结束旅行,求你可能的最大停留次数和最小停留次数

题解:由题意可得几个等式:等式一:ans*L=n*K*t,并且gcd(ans,t)==1,也就是你经过ans次之后停在了初始位置 等式二:L=(a+b)+t1*K  等式三:L=(-a-b)+t2*K 等式四:L=(a-b)+t3*K 等式五:L=(b-a)+t4*K 等式二~五是初始位置和第一次停留的可能情况,而等式一变形为L=n*K/ans * t,则可以分别和等式二~五联立,得到诸如 n*K/ans *t - K*t1 = (a+b)的式子,而ans必须有 n*k%ans==0,所以ans的个数就是n*k的因子数,n*k<=1e10,所以ans的个数很少,所以可以直接通过枚举n*K的因子ans再利用扩展欧几里德来求解t,并且判断 gcd(ans,t)是否=1即可

 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
ll gcd(ll x,ll y){
if(y==)return x;
return gcd(y,x%y);
}
ll qwq[],tot,qaq[],tot2; ll exgcd(ll m, ll n, ll &x, ll &y) {
if (n == ) {
x = ; y = ;
return m;
}
ll a, a1, b, b1, c, d, q, r, t;
a1 = b = ;
a = b1 = ;
c = m; d = n; q = c/d; r = c%d;
while (r) {
c = d;
d = r;
t = a1;
a1 = a;
a = t - q * a;
t = b1;
b1 = b;
b = t - q * b;
q = c/d;
r = c%d;
}
x = a; y = b;
return d;
}
int main(){
ll n,k,a,b;
scanf("%lld%lld%lld%lld",&n,&k,&a,&b);
ll ss=n*k;
for(ll i=;i*i<=ss;i++){
if(ss%i==){
qwq[++tot]=i;
if(ss!=i*i)qwq[++tot]=ss/i;
}
}
sort(qwq+,qwq++tot);
for(int i=;i<=tot;i++){
if((a+b)%gcd(n*k/qwq[i],k)==||(abs(a-b))%gcd(n*k/qwq[i],k)==){
printf("%lld ",qwq[i]);
break;
}
}
for(int i=tot;i>=;i--){
ll q1=gcd(n*k/qwq[i],k);
ll q2=gcd(n*k/qwq[i],k);
if(((a+b)%q1==)||(abs(a-b))%q2==){
if(((a+b)%q1==)){
ll xx,yy;
exgcd(n*k/qwq[i],k,xx,yy);
xx*=(a+b)/q1;
while(xx>&&k/q1)xx-=k/q1;
while(xx<=&&k/q1)xx+=k/q1;
if(gcd(xx,qwq[i])==){printf("%lld\n",qwq[i]);return ;}
}
if((abs(a-b))%q2==){
ll xx,yy;
exgcd(n*k/qwq[i],k,xx,yy);
xx*=abs(a-b)/q2;
while(xx>&&k/q2)xx-=k/q2;
while(xx<=&&k/q2)xx+=k/q2;
if(gcd(xx,qwq[i])==){printf("%lld\n",qwq[i]);return ;}
}
if(((-a-b)%q1==)){
ll xx,yy;
exgcd(n*k/qwq[i],k,xx,yy);
xx*=(-a-b)/q1;
while(xx>&&k/q1)xx-=k/q1;
while(xx<=&&k/q1)xx+=k/q1;
if(gcd(xx,qwq[i])==){printf("%lld\n",qwq[i]);return ;}
}
if((-abs(a-b))%q2==){
ll xx,yy;
exgcd(n*k/qwq[i],k,xx,yy);
xx*=-abs(a-b)/q2;
while(xx>&&k/q2)xx-=k/q2;
while(xx<=&&k/q2)xx+=k/q2;
if(gcd(xx,qwq[i])==){printf("%lld\n",qwq[i]);return ;}
}
}
}
return ;
}

[ Codeforces Round #549 (Div. 2)][D. The Beatles][exgcd]的更多相关文章

  1. Codeforces Round #549 (Div. 1)

    今天试图用typora写题解 真开心 参考 你会发现有很多都是参考的..zblzbl Codeforces Round #549 (Div. 1) 最近脑子不行啦 需要cf来缓解一下 A. The B ...

  2. [题解] Codeforces Round #549 (Div. 2) B. Nirvana

    Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...

  3. Codeforces Round #549 (Div. 2) 训练实录 (5/6)

    The Doors +0 找出输入的01数列里,0或者1先出完的的下标. Nirvana +3 输入n,求1到n的数字,哪个数逐位相乘的积最大,输出最大积. 思路是按位比较,从低到高,依次把小位换成全 ...

  4. Codeforces Round #549 (Div. 1) 题解

    link 前几天补完了某一场很早以前的div1,突然想来更博客,于是就有了这篇文章 A The Beatles 显然若起点和第一次到达的位置距离为 d ,那么经过的不同站点数为 $\frac{nk}{ ...

  5. Codeforces Round #549 (Div. 2) Solution

    传送门 A.The Doors 看懂题目就会写的题 给一个 $01$ 序列,找到最早的位置使得 $0$ 或 $1$ 已经全部出现 #include<iostream> #include&l ...

  6. Codeforces Round #549 (Div. 2) F 数形结合 + 凸包(新坑)

    https://codeforces.com/contest/1143/problem/F 题意 有n条形如\(y=x^2+bx+c\)的抛物线,问有多少条抛物线上方没有其他抛物线的交点 题解 \(y ...

  7. Codeforces Round #549 (Div. 2) E 倍增处理按排列顺序的上一个位置

    https://codeforces.com/contest/1143/problem/E 题意 p为n的一个排列,给出有m个数字的数组a,q次询问,每次询问a数组区间[l,r]中是否存在子序列为p的 ...

  8. Codeforces Round #549 (Div. 2) D 数学

    https://codeforces.com/contest/1143/problem/D 题意 有nk个城市,第1,k+1,2k+1,...,(n-1)k+1城市有餐厅,你每次能走l距离,a为起始位 ...

  9. CodeForces Round #549 Div.2

    A. The Doors 代码: #include <bits/stdc++.h> using namespace std; ; int N; , One = ; int a[maxn], ...

随机推荐

  1. [译]课程 1: 使用 Quartz

    译者注: 原文在这 Lesson 1: Using Quartz 在你使用调度器之前, 你需要先实例化(能猜到是谁么?). 要实例化, 请使用 ISchedulerFactory 的实现. 译者注: ...

  2. Oracle 客户端 NLS_LANG 的设置

    参考链接1: https://blog.csdn.net/xinzhan0/article/details/78311417#t3 参考链接2: https://blog.csdn.net/xinzh ...

  3. 5th,Python购物车模拟

    1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4.可随时退出,退 ...

  4. 数组toString()方法,数组常用操作

    int[] arr ={1,2,3,4,5}; String arrString = Arrays.toString(arr); //输出[I@7150bd4d System.out.println( ...

  5. ios外派公司—提供ios程序员外派ios应用外包业务(北京动点 可签合同)

    北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验: 2.熟练使用Xcode.Objective C编码技能: 3.熟悉iOS开发框 ...

  6. Rancher2.0中使用外置NFS存储部署Nginx实验

    目录: 1.环境准备工作 1.1 准备好Rancher2.0集群环境 1.2 准备好外部NFS服务器 2.Rancher2.0中使用NFS存储的方法 2.1 在集群中创建持久卷(PV) 2.2 在项目 ...

  7. docker-compose 手工指定容器IP

    首先明确两点: 1只有自定义网络,才能手工指定每个容器的ip.默认的bridge是不行的! 2 手工设定了网段比如172.19.0.0   不影响docker在host装的网卡docker0 的172 ...

  8. 日常英语---八、REBOOT - What is the difference? -MapleStory

    日常英语---八.REBOOT - What is the difference? -MapleStory 一.总结 一句话总结: trade transfer drop_rate equipment ...

  9. 流畅的python笔记

    鸭子类型协议不完全总结序列:len,getitem切片:getitemv[0]分量的取值和写值:getitem和setitemv.x属性的取值和写值:getattr和setattr迭代:1)iter, ...

  10. 数独_erlang解题代码

    前几天LP玩数独,玩到大师级各种被虐,我看了看说,分分钟帮你做出来, 结果当然没有做出来. 于是上网搜了下数独的解题代码,看了下C的代码,大多是递归之类的(如http://blog.sina.com. ...