AC Codeforces Round #499 (Div. 2) E. Border 扩展欧几里得
没想出来
对于一般情况,我们知道 时方程是一定有解的。
如果改成 的话该方程有解当且仅当 % 。
这个结论在大于2个个未知数的时候也是成立的,即对于:
是成立的。
在原题中,我们要求的是 中 的解集。
那么我们就可以先将式子转化为 。
根据扩展欧几里得定理, 存在当且仅当 是 的整数倍,我们就现将 求出,并分别乘以 结果大于等于 时停止即可。
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;
}