Codeforces Round #499 (Div. 2)E. Border(離散數學)
阿新 • • 發佈:2019-01-26
題意:給你n種紙幣,然後給你一個k,代表k進位制,意思就是求這n種紙幣的任意組合,然後mod k,能組成多少0~m-1的數字
思路:離散數學的基本知識,n個紙幣和m的最大公約數就是最小生成元,這個元的所有倍數小於m的數就是能生成的數。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+7; #define ll long long #define eps 1e-8 using namespace std; inline int read() { char ch = getchar(); int x = 0, f = 1; while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();} while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();} return x * f; } int n, m, k, x; int main() { n = read(); m = read(); k = m; for(int i = 0; i < n; i++) { x = read(); k = __gcd(k, x); } printf("%d\n",m/k); for(int i = 0; i < m; i += k) printf("%d%c",i, i + k < m ? ' ':'\n'); return 0; }