1. 程式人生 > >Codeforces Round #511 (Div. 2), problem: (C) Enlarge GCD 數論

Codeforces Round #511 (Div. 2), problem: (C) Enlarge GCD 數論

思路大體是先找到an取值範圍內的質數並儲存,求出輸入的資料中最大公倍數並將a陣列都除以最大公倍數,然後遍歷an的取值範圍(從2開始,1不算),如果是質數就統計這個質數和它的倍數,就是使最小公倍數增加所需要去掉的數的個數,遍歷過程中取最小值即可。並注意判定特殊情況。這個方法幾乎要超時了似乎有更好的辦法,但是我沒想到。

ac程式碼:

#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int> #define LL long long #define INF 1000000001 #define N 200005 #define M 15000000 int gcd(int a,int b) { return b?gcd(b,a%b):a;} using namespace std; int a[300005]; int k[M],ss[M]; int main() { int n; int ans = INF; cin >> n; cin >> a[1] >> a[2]; bool fy = true; int
agcd = gcd(a[1],a[2]); if(a[1] != a[2]) fy = false; FORE(i,3,n){ cin >> a[i]; agcd = gcd(a[i],agcd); if(a[i] != a[i-1]) fy = false; } FORE(i,2,int(sqrt(M)+1)){ if(ss[i] == 0){ for(int j = i*2;j <= M;j+=i) ss[j] = 1; } } FORE(i,1,n){ k[a[i]/agcd]++; }