1. 程式人生 > >數字任意組合 - gcd

數字任意組合 - gcd

other it is nbsp 取模 can hang ane tput num

鏈接:https://www.nowcoder.com/acm/contest/160/A
來源:牛客網

題目描述
有一個計數器,計數器的初始值為0,每次操作你可以把計數器的值加上a1,a2,...,an中的任意一個整數,操作次數不限(可以為0次),問計數器的值對m取模後有幾種可能。
輸入描述:

第一行兩個整數n,m
接下來一行n個整數表示a1,a2,...,an
1≤n≤100
1≤m,a1,a2,...,an≤1000000000

輸出描述:

輸出一個整數表示答案

輸入

3 6
6 4 8

輸出


3

題意 : 將所給的幾個數字任意組合,再將組合出來的數對 M 取模,求模數的種類數

思路分析 : 解法很巧妙的利用了 gcd , 求一下所有數字的 gcd , 因為是要求個數,再將所求 gcd 與 m 求一次 gcd ,最後 m / gcd 即為答案

    若兩個數 gcd 為 1, 則可以通過對一個數取模,拼湊出模數以內的任意數,想一想就明白了

代碼示例 :

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;
#define ll long long
 
ll a[105];
ll n, m;
ll gcd(ll a, ll b) {return b==0?a:gcd(b, a%b); }
set<ll>s;
 
int main () {
 
    cin >> n >> m;
    ll g = 0;
    for(ll i = 1; i <= n; i++){
        scanf("%lld", &a[i]);
        g = gcd(g, a[i]);
    }
    ll g2 = gcd(g, m); 
    printf("%lld\n", m/g2);
    return 0;
}

Astronaut Natasha arrived on Mars. She knows that the Martians are very poor aliens. To ensure a better life for the Mars citizens, their emperor decided to take tax from every tourist who visited the planet. Natasha is the inhabitant of Earth, therefore she had to pay the tax to enter the territory of Mars.

There are n
banknote denominations on Mars: the value of i-th banknote is ai

. Natasha has an infinite number of banknotes of each denomination.

Martians have k
fingers on their hands, so they use a number system with base k. In addition, the Martians consider the digit d (in the number system with base k) divine. Thus, if the last digit in Natasha‘s tax amount written in the number system with the base k is d

, the Martians will be happy. Unfortunately, Natasha does not know the Martians‘ divine digit yet.

Determine for which values d Natasha can make the Martians happy.

Natasha can use only her banknotes. Martians don‘t give her change.
Input

The first line contains two integers n
and k (1≤n≤100000, 2≤k≤100000

) — the number of denominations of banknotes and the base of the number system on Mars.

The second line contains n
integers a1,a2,…,an (1≤ai≤109

) — denominations of banknotes on Mars.

All numbers are given in decimal notation.
Output

On the first line output the number of values d

for which Natasha can make the Martians happy.

In the second line, output all these values in increasing order.

Print all numbers in decimal notation.
Examples
Input
Copy

2 8
12 20

Output
Copy

2
0 4

Input
Copy

3 10
10 20 30

Output
Copy

1
0

Note

Consider the first test case. It uses the octal number system.

If you take one banknote with the value of 12
, you will get 148 in octal system. The last digit is 48

.

If you take one banknote with the value of 12
and one banknote with the value of 20, the total value will be 32. In the octal system, it is 408. The last digit is 08

.

If you take two banknotes with the value of 20
, the total value will be 40, this is 508 in the octal system. The last digit is 08

.

No other digits other than 08
and 48 can be obtained. Digits 08 and 48

could also be obtained in other ways.

The second test case uses the decimal number system. The nominals of all banknotes end with zero, so Natasha can give the Martians only the amount whose decimal notation also ends with zero.

題意 :基本同上面的題,只不過數據範圍不太一樣,並且此題需要輸出不同的模數是什麽
思路分析 :基本同上,加個 set 即可

代碼示例 :

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;
#define ll long long
 
ll n, k;
ll gcd(ll a, ll b) {return b==0?a:gcd(b, a%b); }
set<ll>s;
 
int main () {
    ll x;
    
    cin >> n >> k;
    ll g = 0;
    for(ll i = 1; i <= n; i++){
        scanf("%lld", &x);
        g = gcd(g, x);
    }
    for(ll i = 0, j = 0; i <= k; i++, j += g){
        s.insert(j%k);
    }
    printf("%d\n", s.size());
    set<ll>:: iterator it;
    
    for(it = s.begin(); it != s.end(); it++) {
        printf("%d ", *it); 
    }
    return 0;
}

數字任意組合 - gcd