zoukankan      html  css  js  c++  java
  • Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)

    原题地址

    题目描述 

    有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能。

    输入描述:

    第一行两个整数n,m
    接下来一行n个整数表示a1,a2,...,an
    1≤n≤100
    1≤m,a1,a2,...,an≤1000000000

    输出描述:

    输出一个整数表示答案
    示例1

    输入

    复制
    3 6
    6 4 8

    输出

    复制
    3


    题解:假设K1为A1取的个数;根据题意题目变成a1*k1+a2*k2+a3*k3+a4*k4+....an*kn=P;
    让我们求P的可能性,

    用到了https://blog.csdn.net/huayunhualuo/article/details/52215182

    在数论中,裴蜀等式或裴蜀定理是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):

     
    ax+by=m
    有整数解时当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用扩展欧几里得算法求得。 
    例如,12和42的最大公约数是6,则方程12x+42y=6有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。特别来说,方程 ax+by=1 有整数解当且仅当整数a和b互素。

    所以这题求N个数关于M的余数;就把N个数的gcd求出来然后求小于M的GCD的倍数的个数就是答案;

    代码”
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=3e6+50;
    const ll inf=0x3f3f3f3f3f3f;
    ll gcd(ll a, ll b)
    {
        if(b == 0)
            return a;
        return gcd(b, a % b);
    }
    
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        int n,k;
        cin>>n>>k;
        int i,tmp=0;
        ll sum  = k;
        ll t;
        
        for(int i = 1; i <= n; ++i) {
            cin >> t;
            sum = gcd(sum, t);
        }
        cout<<ll(k/sum)<<endl;
    
        return 0;
    }
    

      



  • 相关阅读:
    python 约束与异常处理
    ActiveMQ
    SpringMVC项目,启动项目怎么总是报找不到log4j.properties文件
    java 字符串处理
    java面向对象学习笔记
    JSONArray遍历
    get/post方式调用http接口
    IO流认识
    Apache Mina 入门实例
    “wsimport -keep ”生成客户端报错“Use of SOAP Encoding is not supported.”
  • 原文地址:https://www.cnblogs.com/luowentao/p/9495549.html
Copyright © 2011-2022 走看看