[Codeforces 1011E] Border
Posted evenbao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Codeforces 1011E] Border相关的知识,希望对你有一定的参考价值。
[题目链接]
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 ",(int)ans.size()); for (set< int > :: iterator it = ans.begin(); it != ans.end(); it++) printf("%d ",*it); printf(" "); return 0; }
以上是关于[Codeforces 1011E] Border的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces #499 E Border ( 裴蜀定理 )