Today Pari and Arya are playing a game called Remainders.
Pari chooses two positive integer x andk, and tells Arya k but notx. Arya have to find the value . There are n ancient numbers c1, c2, ..., cn and Pari has to tell Arya if Arya wants. Givenk and the ancient values, tell us if Arya has a winning strategy independent of value ofx or not. Formally, is it true that Arya can understand the value for any positive integerx?
Note, that means the remainder ofx after dividing it by y.
The first line of the input contains two integers n andk (1 ≤ n, k ≤ 1 000 000) — the number of ancient integers and value k that is chosen by Pari.
The second line contains n integers c1, c2, ..., cn (1 ≤ ci ≤ 1 000 000).
Print "Yes" (without quotes) if Arya has a winning strategy independent of value ofx, or "No" (without quotes) otherwise.
4 5 2 3 5 12
Yes
2 7 2 3
No
In the first sample, Arya can understand because5 is one of the ancient numbers.
In the second sample, Arya can't be sure what is. For example1 and 7 have the same remainders after dividing by2 and 3, but they differ in remainders after dividing by7.
重新修正下这篇博客!因学长的教训,重新思考了这个问题!
大体题意:
告诉你k 但不告诉你x 并且告诉你n个ci来,你也知道x%ci,想让你求出x mod k来!问是否有唯一解!
思路:
反证法,假设解不唯一,有x1,x2,那么x1,x2满足:
x1 % ci == x2 % ci 并且x1 % k != x2 % k,所以 (x1 - x2) % ci == 0 ,(x1-x2) % k != 0
并且lcm(c1,c2,,,,cn) % ci == 0
,所以lcm % (x1-x2) == 0.
且 (x1-x2) % k != 0;
所以lcm % k != 0
所以命题: 如果解不唯一,那么lcm % k != 0
逆否命题为: 若lcm % k == 0 那么 解唯一!
所以只需要判断lcm是否k 的整数倍,
也就是说这个问题可以转换为:
是否存在x使得 x是c1,c2,c3,,,cn,k的整数倍!
是的话就是yes,否则就是no!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return !b ? a : gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a*b/gcd(a,b);
}
int main(){
// printf("%d\n",gcd(6,13));
int n;
ll k;
scanf("%d%I64d",&n,&k);
ll ans = 1;
bool ok = false;
for (int i = 0; i < n; ++i){
ll x;
scanf("%I64d",&x);
if (ans)
ans = lcm(ans,x) % k;
if (ans == 0)ok=true;
}
if (ok)printf("Yes\n");
else printf("No\n");
return 0;
}