1. 程式人生 > >Codeforces Round #499 (Div. 2)E. Border(離散數學)

Codeforces Round #499 (Div. 2)E. Border(離散數學)

題意:給你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;
}