zoukankan      html  css  js  c++  java
  • CF687B Remainders Game

     

    题意:已知n个数,第i个为ci,给定一个数x mod ci的结果,再给点一个k,问能不能知道x mod k的值?

    分析:刚看题目的我一脸蒙蔽,对题意有点不理解,能的情况似乎有很多,我该从哪里下手呢?

         先从不能的情况来看,可以知道,如果不能知道x mod k的值,当且仅当有两个解x1,x2, x1 ≡ x2(mod ci)x1 ≢ x2 (mod k) 左边这个是不同余的意思,

       为什么是这样的呢?因为题目中说x mod k的值是唯一的,我们却会出现两个满足题意的x值 mod k的值不同,这就矛盾了。

         那么我们怎样求解这两个同余式呢?如果x1 ≡ x2(mod ci),那么(x1 - x2) % ci = 0,所以x1 - x2一定是ci的最小公倍数的倍数,

        然后对第二个式子变形一下:(x1 - x2) % k != 0,也就是说k不整除lcm{ci}那么这道题就变成了要我们求解lcm{ci}到底是不是k的倍数。

         但是直接求会lcm会爆掉啊,如果取模的话涉及到除法要求逆元复杂度又会爆炸,该怎么处理?

         正确的方法是分解质因数:将k表示为p1^k1 * p2 ^ k2 * ... *pn ^ kn的形式,如果lcm{ci}是k的倍数,那么p1^k1、p2^k2...pn^kn一定会全部

    出现在某些ci中,我们只需要在读入的时候检验一下打个标记就好了。一位大神说的对:lcm就是质因子的并集,gcd就是质因子的交集,

    遇到gcd、lcm,分解一下质因子不失为一种好的方法。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    
    using namespace std;
    
    int n, k, c,tot,prime[100010];
    bool vis[100010];
    
    int main()
    {
        scanf("%d%d", &n, &k);
        for (int i = 2; i <= sqrt(k); i++)
        {
            if (k % i == 0)
            {
                int t = 1;
                while (k % i == 0)
                {
                    t *= i;
                    k /= i;
                }
                prime[++tot] = t;
            }
        }
        if (k)
            prime[++tot] = k;
        for (int i = 1; i <= n; i++)
        {
            int c;
            scanf("%d", &c);
            for (int j = 1; j <= tot; j++)
                if (c % prime[j] == 0)
                    vis[j] = 1;
        }
        for (int i = 1; i <= tot; i++)
            if (!vis[i])
            {
            printf("No
    ");
            return 0;
            }
        printf("Yes
    ");
    
        return 0;
    }
  • 相关阅读:
    android自己定义控件系列教程----视图
    Android怎样监听蓝牙耳机的按键事件
    Putty SSH简单使用
    Linux配置无线网卡驱动实现无线上网
    Oracle在中文环境下出现乱码解决办法
    百度云盘破解限速|个人值得拥有
    Ubuntu安装出现左上角光标一直闪解决方式
    ubuntu-16.4TLS安装QQ
    2015毕业找工作纪实|一年的蜕变毕业生
    安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7392444.html
Copyright © 2011-2022 走看看