没想出来QAQ....
对于一般情况,我们知道 ax+by=gcd(a,b) 时方程是一定有解的。
如果改成 ax+by=c 的话该方程有解当且仅当 c % gcd(a,b)==0 。
这个结论在大于2个个未知数的时候也是成立的,即对于:
a1x1+a2x2+a3x3+......anxn=gcd(a1,a2,a3,...an) 是成立的。
在原题中,我们要求的是 a1x1+a2x2+a3x3+......anxn≡ m(mod k) 中 m 的解集。
那么我们就可以先将式子转化为 a1x1+a2x2+a3x3+......anxn−bk=m。
根据扩展欧几里得定理,m 存在当且仅当 m 是 gcd(a1...an,k) 的整数倍,我们就现将 gcd(a1...an,k) 求出,并分别乘以 2,3,4... 结果大于等于 k 时停止即可。
Code:
#include<cstdio>
using namespace std;
inline int gcd(int a,int b) { return b == 0 ? a : gcd(b, a % b); }
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int m = k;
for(int i = 1;i <= n; ++i)
{
int a; scanf("%d",&a);
m = gcd(m, a);
}
printf("%d
",k / m);
int cnt = 0;
while(cnt < k)
{
printf("%d ",cnt);
cnt += m;
}
return 0;
}