Codeforces 1011E - Border

传送门: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=j\cdot G,j\in\mathbb{Z}$。于是,函数$f(x_1,x_2,\cdots,x_n)=\sum_{i=1}^n {a_i x_i},(x_1,x_2,\cdots,x_n)^T\in \mathbb{Z}$的值域为$\{j\cdot G|j\in \mathbb{Z}\}$。如此,函数在模k下的值域为$\{j\cdot G\mod k|j\in \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 << " ";
}

 

posted on 2018-07-28 20:01  SiuGinHung  阅读(386)  评论(2编辑  收藏  举报

导航