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;
}

 

posted @ 2019-08-13 21:09  philo_zhou  阅读(189)  评论(0编辑  收藏  举报