codeforces round 360 div2 Remainders Game gcd+模线性方程组

来源:互联网 发布:人人商城 源码 编辑:程序博客网 时间:2024/05/21 00:47
/*     题目描述:给出n个数c1 , c2 , ... , cn ,以及一个正整数k(所有数都是<=1e6的正整数)问是否对于任意的x,只要知道了          x%c1 , x%c2 , ... ,x%cn的值,就一定能确定x%k的值                            思路:首先根据模线性方程组的求解过程可知,若已知x%c1 , x%c2 , ... ,x%cn的值,便可知x % M的值,其中M是c1,c2,...       cn的最小公倍数,当且仅当k是M的因子时,对于任意的x可以确定x%k的值,所以问题就成了M是否含有因子k                       判断的方法可以是记录已经可以消掉的k中的因子的乘积d,每次取k与c[i]之间的最大公约数GCD,那么GCD/gcd(GCD,d)便是       c[i]可以贡献出的消掉的k中的因子,最终判断消掉的因子乘积d是否等于k就可以*/#pragma warning(disable:4786)#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<map>#include<set>#include<vector>#include<cmath>#include<string>#include<sstream>#define LL __int64#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)#define mem(a,x) memset(a,x,sizeof(a))#define lson l,m,x<<1#define rson m+1,r,x<<1|1using namespace std;const int INF = 0x3f3f3f3f;const int mod = 1e9 + 7;const double PI = acos(-1.0);const double eps=1e-6;const int maxn = 1e6 + 5;inline LL gcd(LL a , LL b){    return b == 0 ? a : gcd(b , a % b);}LL c[maxn];int main(){    int n ;    LL k;    scanf("%d%I64d",&n , &k);    for(int i = 1 ; i<= n ; i++){        scanf("%I64d",&c[i]);    }    LL d = 1LL , GCD;    for(int i = 1 ; i<= n ; i++){        GCD = gcd(c[i] , k);        GCD = GCD / gcd(GCD , d);        d *= GCD;    }    if(d == k)        puts("Yes");    else        puts("No");    return 0;}

0 0
原创粉丝点击