D. Remainders Game
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Today Pari and Arya are playing a game called Remainders.
Pari chooses two positive integer x and k, and tells Arya k but not x. Arya have to find the value . There are n ancient numbers c1, c2, …, cn and Pari has to tell Arya if Arya wants. Given k and the ancient values, tell us if Arya has a winning strategy independent of value of x or not. Formally, is it true that Arya can understand the value for any positive integer x?
Note, that means the remainder of x after dividing it by y.
Input
The first line of the input contains two integers n and k (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).
Output
Print “Yes” (without quotes) if Arya has a winning strategy independent of value of x, or “No” (without quotes) otherwise.
Examples
Input
4 5
2 3 5 12
Output
Yes
Input
2 7
2 3
Output
No
题意
给你一个数k和n个数c1到cn,问现在有一个未知数x,如果你知道x%ci,那么你能否给出x%k
思路
根据同余的原理,k分解质因数表示为k=p1^t1*p2^t2……pn^tn,那么x%k=x%p1^t1%p2^t2……%pn^tn,则如果能对任意的x给出x%k,应有n个数ci的质因数包含p1^t1,p2^2……pn^tn。
这等价于lca(c1,c2……cn)%k=0
具体计算时应注意避免爆long long,计算lca的同时与k计算gcd
代码
#include <cstdio>
long long gcd(long long a,long long b)
{
return a==0 ? b : gcd(b%a,a);
}
long long c[1000010];
int main()
{
int n;
long long k;
scanf("%d %I64d",&n,&k);
for (int i=0;i<n;i++)
{
scanf("%I64d",&c[i]);
}
long long lca=c[0];
if (lca%k==0)
{
printf("Yes");
return 0;
}
for (int i=1;i<n;i++)
{
lca=lca*c[i]/gcd(lca,c[i]);
if (lca%k==0)
{
printf("Yes");
return 0;
}
lca=gcd(lca,k);
}
printf("No");
}