原题链接https://codeforces.com/contest/1155/problem/C题目大意:Ivan决定制定一个闹钟使得在他需要工作的时候叫醒他,但他又只想制定一个间隔为p的闹钟。例如:已知他需要被叫醒的时间为:
,给出m个闹钟的间隔,问是否有一个闹钟能够满足他的要求,可以的话输出初始的闹钟时间和间隔的序号。
解题思路:
1、首先要记录下第一个需要被叫醒的时间。
2、算出每次需要被叫醒的间隔的最大公因数。
3、传入m个闹钟的间隔,判断是否满足条件,输出结果。
辗转相除法(GCD)求最大公因数:
if(a < b)swap(a,b)
while(a%b != 0){
a = a%b;
swap(a,b);
}
ans = b
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MP make_pair
#define SZ(X) ((int)(X).size())
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
ll x1,x2,p,td;
int n,m;
int main(){
scanf("%d%d",&n,&m);
scanf("%lld%lld",&x1,&x2);
//记录第一个时间序列及第一个时间间隔
//b->第一个时间序列,d->第一个时间间隔
ll d = x2 - x1;
ll b = x1;
for(int i = 2;i < n;i ++)
{
scanf("%lld",&x1);
swap(x1,x2);
td = x2 - x1;
//辗转相除
if(td > d)swap(d,td);
while(d % td != 0){
ll r = d%td;
d = td;
td = r;
}
d = td;
}
ll f = -1;
for(int i = 0;i < m;i ++){
scanf("%lld",&p);
if(d%p == 0){
f = i;
break;
}
}
if(f >= 0) printf("YES\n%lld %lld\n",b,f + 1);
else printf("NO\n");
return 0;
}