codeforces 1010C. Border

题目大意:从数组a中取任意个数求和对k取模,求余数的个数

解法:让a各元素对k取模,设k与所有模值的最大公约数为x,则答案中可取得的余数为x的倍数,特殊处理一下0(k)即可

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<fstream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define scd(a) scanf("%d",&a)
#define scf(a) scanf("%lf",&a)
#define scl(a) scanf("%lld",&a)
#define sci(a) scanf("%I64d",&a)
#define scs(a) scanf("%s",a)
typedef long long ll;
const int desll[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
const ll mod=1e9+7;
const int maxn=1e5+7;
const int maxm=1e8+7;
const double eps=1e-4;
int m,n,ar[maxn];
char ch[maxn];
set<int> s;
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}

int main()
{
    scd(n);
    scd(m);
    s.clear();
    memset(ar,0,sizeof(ar));
    int res=m;
    for(int i=0;i<n;i++){
        int x;scd(x);
        if(x%m==0)ar[0]=1;
        res=gcd(res,x%m);
    }
    for(ll i=(ll)res;i<=m;i+=res)ar[i]=1;
    if(ar[m])ar[0]=1;
    int ins=0;
    for(int i=0;i<m;i++){
        if(ar[i])ins++;
    }
    printf("%d\n",ins);
    res=0;
    for(int i=0;i<ins;i++){
        while(!ar[res])res++;
        printf("%d%c",res,i==ins-1?'\n':' ');
        res++;
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/jfnfjivkdnfjf/article/details/81232916