码迷,mamicode.com
首页 > 其他好文 > 详细

[Codeforces 1011E] Border

时间:2018-10-06 12:05:48      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:src   insert   line   getc   get   iterator   nal   ORC   lse   

[题目链接]

        https://codeforces.com/contest/1011/problem/E

[算法]

         裴蜀定理 : 设技术分享图片为n个整数,d是它们的最大公约数,那么存在整数技术分享图片 使得 技术分享图片

         显然 , 我们只需求出a1,a2...an模k意义下的最大公约数G,然后枚举G的倍数即可

         时间复杂度 : O(NlogK)

[代码]

        

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010

int n , k;
int a[MAXN];

template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == -) f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - 0;
    x *= f;
}
inline int gcd(int x,int y)
{
        if (y == 0) return x;
        else return gcd(y,x % y);
}

int main()
{
        
        read(n); read(k); 
        for (int i = 1; i <= n; i++) 
        {
                read(a[i]);
                a[i] %= k;
                if (a[i] == 0) a[i] = k;
        }
        int g = a[1];
        for (int i = 2; i <= n; i++) g = gcd(g,a[i]);
        set< int > ans;
        int now = 0;
        for (int i = 0; i < k; i++) 
        {
                ans.insert(now);
                now = (now + g) % k;
        }
        printf("%d\n",(int)ans.size());
        for (set< int > :: iterator it = ans.begin(); it != ans.end(); it++) printf("%d ",*it);
        printf("\n");
        
        return 0;
    
}

 

[Codeforces 1011E] Border

标签:src   insert   line   getc   get   iterator   nal   ORC   lse   

原文地址:https://www.cnblogs.com/evenbao/p/9746763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!