499div2-E Border :裴蜀定理
这个定理就像类似学扩展欧几里得判断是否有解的条件,当时是ax+by = c;仅当c = k*gcd(a,b)时有解,其实也就是只要是公约数的倍数就行。
而裴蜀定理是多个未知量x1*a1+x2*a2+...xn*an = c, 也是仅当 c = k * gcd(a1, a2....an)时有解。
思路:求出gcd,然后枚举所有解的可能就行了。也就是令k = 1 2 3 ....
下面的代码枚举到k是因为,枚举到k+1时和枚举1时一样的,(gcd*k + gcd)% k = gcd%k;
#include <bits/stdc++.h> #define ll long long using namespace std; set<int> ma; int main(){ ll n, k, x, g; cin >> n >> k >> g; for(int i = 2; i <= n; i++){ cin >> x; g = __gcd(g, x); } for(ll i = 1; i <= k; i++) ma.insert(i*g%k); cout << ma.size() << endl; for(auto it = ma.begin(); it != ma.end(); it++) cout << *it << ' '; return 0; }