裴蜀定理:
裴蜀定理(或贝祖定理,Bézout's identity)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且GCD(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1.
题目链接:
https://www.nowcoder.com/acm/contest/160/A
题目:
题目描述
有一个计数器,计数器的初始值为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)%m=a
即等价于:
a1*k1+a2*k2+a3*k3+......an*kn-km*m=a
则根据裴蜀定理,当a为gcd(a1,a2,a3,...,an,m)的倍数时,等式有解。
所以我们只要求出g求出小于等于m且是gcd(a1,a2,a3,...,an,m)的倍数的数的个数即可。
即m/gcd(a1,a2,a3,...,an,m)
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int t,gcd;
gcd=m;
for(int i=0;i<n;i++)
{
scanf("%d",&t);
gcd=__gcd(t,gcd);
}
printf("%d\n",m/gcd);
return 0;
}