E. Border (数论)

本文解析了CodeForces上的一道题目E,通过数论方法寻找规律来解决该问题。主要内容包括理解题意、算法思路及实现代码,旨在帮助读者理解和掌握此类问题的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目链接: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]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值