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