题目链接:点我
题目大意:青蛙初始位置在0点,给一个目标地点x,给你n个步长,问青蛙能否跳到x。
解题思路:只需要判断目标X能否整除所有步长的最大公约数即可。
知识点:这道题用到了初等数论中的知识,即 aX+bY=c有整数解的充要条件是 c能整除a,b的最大公约数,然后将这个推广到n个变量同样成立。
证明:设(a,b)=d 贝祖定理
1)充分性:因为d=(a,b),所以存在x0,y0∈Z使ax0+by0=d,又d│c,所以c=dk
=k(ax0+by0)=a(kx0)+b(ky0),所以方程ax+by=c有整数解(kx0,ky0)
2)必要性:因为ax0+by0=c,x0,y0∈Z
d是a,b的最大公约数,所以d│a,d│b,故d│ax0+by0,即d│c
AC代码:
/*
2017年8月13日22:26:49
C
数论
AC
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int gcd(int x,int y)
{
return y ? gcd(y, x % y) : x;
}
int main(){
int n,x,g;
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
if(i==1) g=a;
else g=gcd(g,a);
}
if(abs(x)%g==0) printf("YES\n");
else printf("NO\n");
return 0;
}