Codeforces Round #511 (Div. 2), problem: (C) Enlarge GCD 數論
阿新 • • 發佈:2018-11-19
思路大體是先找到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]++;
}