传送门:http://codeforces.com/contest/1011/problem/E
本题是一个数论问题:扩展Euclid定理。
给定一个正整数列a[1,n],求$sum_{i=1}^n {a_i x_i}mod k$的值域,其中,x[i]为自然数。
根据扩展Euclid定理,有:方程$sum_{i=1}^n {a_i x_i}=C$有整数解,当且仅当$gcd(a_1,a_2,cdots,a_n)setminus C$。令最大公约数为$G=gcd(a_1,a_2,cdots,a_n)$,则这一充要条件可以写成以下形式:$C=jcdot G,jinmathbb{Z}$。于是,函数$f(x_1,x_2,cdots,x_n)=sum_{i=1}^n {a_i x_i},(x_1,x_2,cdots,x_n)^Tin mathbb{Z}$的值域为${jcdot G|jin mathbb{Z}}$。如此,函数在模k下的值域为${jcdot Gmod k|jin mathbb{Z}}$。参考程序如下:
#include <bits/stdc++.h> using namespace std; int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } int main(void) { int n, k; cin >> n >> k; int g = k; while (n--) { int a; cin >> a; g = gcd(g, a); } cout << k / g << endl; for (int i = 0; i < k; i += g) cout << i << " "; }