[ Codeforces Round #549 (Div. 2)][D. The Beatles][exgcd]
https://codeforces.com/contest/1143/problem/D
1 second
256 megabytes
standard input
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.
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.
Print the two integers xx and yy.
2 3
1 1
1 6
3 2
0 0
1 3
1 10
5 3
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]的更多相关文章
- Codeforces Round #549 (Div. 1)
今天试图用typora写题解 真开心 参考 你会发现有很多都是参考的..zblzbl Codeforces Round #549 (Div. 1) 最近脑子不行啦 需要cf来缓解一下 A. The B ...
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...
- Codeforces Round #549 (Div. 2) 训练实录 (5/6)
The Doors +0 找出输入的01数列里,0或者1先出完的的下标. Nirvana +3 输入n,求1到n的数字,哪个数逐位相乘的积最大,输出最大积. 思路是按位比较,从低到高,依次把小位换成全 ...
- Codeforces Round #549 (Div. 1) 题解
link 前几天补完了某一场很早以前的div1,突然想来更博客,于是就有了这篇文章 A The Beatles 显然若起点和第一次到达的位置距离为 d ,那么经过的不同站点数为 $\frac{nk}{ ...
- Codeforces Round #549 (Div. 2) Solution
传送门 A.The Doors 看懂题目就会写的题 给一个 $01$ 序列,找到最早的位置使得 $0$ 或 $1$ 已经全部出现 #include<iostream> #include&l ...
- Codeforces Round #549 (Div. 2) F 数形结合 + 凸包(新坑)
https://codeforces.com/contest/1143/problem/F 题意 有n条形如\(y=x^2+bx+c\)的抛物线,问有多少条抛物线上方没有其他抛物线的交点 题解 \(y ...
- Codeforces Round #549 (Div. 2) E 倍增处理按排列顺序的上一个位置
https://codeforces.com/contest/1143/problem/E 题意 p为n的一个排列,给出有m个数字的数组a,q次询问,每次询问a数组区间[l,r]中是否存在子序列为p的 ...
- 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为起始位 ...
- CodeForces Round #549 Div.2
A. The Doors 代码: #include <bits/stdc++.h> using namespace std; ; int N; , One = ; int a[maxn], ...
随机推荐
- https://localhost:1158/em运行不正常
1.页面无法打开 一般是由于网站安全问题直接挂掉,可以更换浏览器,如Google Chrome.Fire Fox等.不建议使用IE Google浏览器使用如下, 直接继续 接着以用户sys,密码cha ...
- 使用Rancher和私有仓库快速搭建Kubernetes集群
来来来,先出题:Rancher可以快速部署Kubernetes,但其使用的gcr.io上的镜像无法下载怎么办?使用Rancher可以快速部署Kubernetes,但我们需要下载哪些镜像?Rancher ...
- 多路径multipath配置,udev绑定
多路径multipath配置 以root用户登录 1.查看共享磁盘是否挂载成功 #fdisk -l 2.生成配置文件 #mpathconf --enable 修改配置文件权限 #chmod 644 / ...
- Openstack中用秘钥对(keypair)生成和访问虚机的方法
Openstack中用镜像文件生成的image来创建虚机(VM或Instance)时, 通常不支持用户名加密码的ssh方式登录访问该VM,而是用秘钥对(keypair)方式. 这里以Centos的镜像 ...
- jps: command not found
在/etc/profile中添加javahome的 path export JAVA_HOME=/usr/java/jdk1.8.0_131export PATH=$PATH:$JAVA_HOME/b ...
- Matlab:椭圆方程的导数边值问题
tic; clear clc N=; M=*N; h1=/M; h2=/N; x=:h1:; y=:h2:; fun=inline('exp(x)*sin(pi*y)','x','y'); f=inl ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 使用Python-Libvirt GUI 实现KVM 虚拟机 界面化管理
一.KVM环境的搭建 1.安装VMware(略) 2.在VMware中安装Linux系统(略,Ubuntu16.04) 打开支持虚拟化 网络选择桥接模式 3.安装qemu apt-get instal ...
- linux如何让一个程序崩溃后自动重启
思路: 写一个脚本 监控程序的运行状态 没有运行启动运行 已运行不做操作. 如果在控制台启动脚本 注意必须 nohup sh xxx.sh & while true do ps -ef ...
- webstorm激活教程
虽然webStorm,phpStorm以及jetbrains系列的很好用,但是每隔一段时间就需要激活一下,这样太费劲了,今天军哥给大家推荐一个永久激活的办法 此教程适用于jetbrains 的所有系列 ...