版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}