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 阅读(389) 评论(2) 编辑 收藏 举报