Codeforces Round #360 (Div. 2) D 数学题



链接:戳这里


D. Remainders Game
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard 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
Note
In the first sample, Arya can understand  because 5 is one of the ancient numbers.

In the second sample, Arya can't be sure what  is. For example 1 and 7 have the same remainders after dividing by 2 and 3, but they differ in remainders after dividing by 7.


题意:

给定n和k,要求去猜x%k的值,其中n个数ci表示知道了所有的x%ci的值

问能不能知道x%k的值


思路:

根据中国剩余定理若要求出x%k的值,k=m1*m2*m3*...mn

其中mi互素,且k必须分解成k=p1^a1*p2^a2*...*pn^an (其中pi为素数)

那么我们只需要判断所有的ci的乘积能不能分解出一个数Y使得Y==k,由于数太大会爆ll

所以对于当前ci,我们都取出当前所有ci的LCM,再跟k取GCD

那么这个GCD肯定是k中的一部分,最后判断所取出来的GCD能否拼成k


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<iomanip>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
#define MAX 1000100
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef unsigned long long ull;
#define INF (1ll<<60)-1
using namespace std;
ll n,K;
ll c[1000100];
ll GCD(ll a,ll b){
    return b==0 ? a : GCD(b,a%b);
}
ll LCM(ll a,ll b){
    ll gcd=GCD(a,b);
    return a*b/gcd;
}
int main(){
    scanf("%I64d%I64d",&n,&K);
    for(int i=1;i<=n;i++) scanf("%I64d",&c[i]);
    ll lcm=1;
    for(int i=1;i<=n;i++){
        lcm=LCM(lcm,c[i]);
        lcm=GCD(lcm,K);
        if(lcm==K) {
            printf("Yes\n");
            return 0;
        }
    }
    printf("No\n");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值