裴蜀定理
若a,b是整数,且(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1.
题目
题目描述
有一个计数器,计数器的初始值为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
题解
假设对数an取的个数为kn,可得到如下等式:
a1*k1+a2*k2+a3*k3+......an*kn=p
当p为gcd(a1,a2,a3...an)的倍数时,等式有解。
所以我们只要求出d=gcd(a1,a2,a3...an),然后求出小于m且是d的倍数的个数即可。
注意:这里求公约数的是时候要把m也算进去。
p=gcd(a1,a2...an) 设px%m=a,p的x倍对m取余为a
则有 px-my=a,翡蜀定理,若想要等式有解a必须为gcd(p,m)的倍数.
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;ll m;
ll arr[110];
int main()
{
while(~scanf("%d%lld",&n,&m)) {
ll g = m,x;
for(int i=0;i<n;i++) scanf("%lld",&x),g = __gcd(g,x);
printf("%lld\n",m/g);
}
return 0;
}