E. Border (数论)

  • 题目链接:http://codeforces.com/contest/1011/problem/E
  • 题意:给你一个数k,以及n个十进制数,要求出在k进制下,在这n个数中任取任意个某数或某些数相加,可能的最后的一位数字有哪几种。
  • 算法:数论,找规律
  • 思路:现将这n个数全部转换成k进制,对k取余,即可得其最后一位数。接下来只需要对这些取余后的数操作即可,之前的不影响。可以发现,设某数值为a,任意个a的和在k进制下能形成的尾数为a与k的最大公因数的倍数。则找出取余后的n个数与k的最大公因数x,则x在k内的倍数即为所有可能出现的尾数。

#include <bits/stdc++.h>
#define pi acos(-1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 100000 + 10;
const int mod = 1e9 + 7;

int a[maxn];

int gcd(int a, int b)
{
    return b?gcd(b, a%b):a;
}



int main()
{
    int n, k;
    scanf("%d%d", &n, &k);
    int tmp = k;
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
        a[i] %= k;
        tmp = gcd(tmp, a[i]);
    }
    printf("%d\n", k/tmp);
    for(int i=0; i*tmp<k; i++){
        printf("%d%c", i*tmp, " \n"[i==k/tmp]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37352710/article/details/81237165