Wannafly挑战赛22—计数器(裴蜀定理)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangzhiyuan123/article/details/82011992

题目链接:传送门

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

有一个计数器,计数器的初始值为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

解题思路:

裴蜀定理:若a,b是整数,且(a,b) = d,那么对于任意整数x,y,ax+by都是d的倍数,特别的,一定存在x,y使ax+by = d存在。

n个整数间的裴蜀定理:

设a1,a2,.....,an是n个整数,d是他们的最大公约数,那么存在x1,x2,.......,xn使得a1x1+a2x2+......+anxn = d。

依题设a1,a2,......,an的最大公约数为d,则求m%dx的解,若想my-dx = a有解,a是(m,d)的倍数,求得(m,d) = p,最终答案为m/p。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <ctime>

using namespace std;

typedef long long llt;

const int INF = 0x3fffffff;
const int N = 100010;
const double pi = acos(-1);
const int mod = 1e9+7;

int gcd(int x,int y)
{
    if(y == 0) return x;
    else return gcd(y,x%y);
}

int main()
{
    int n,m,a,g;
    scanf("%d%d",&n,&m);
    g = m;
    for(int i = 0; i < n; ++i){
        scanf("%d",&a);
        g = gcd(g,a);
    }
    printf("%d\n",m/g);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jiangzhiyuan123/article/details/82011992
今日推荐