P4571 [JSOI2009]瓶子和燃料
阿新 • • 發佈:2021-08-21
題目
分析
使用裴蜀定理可以很容易轉化成:給 \(n\) 個數選擇其中 \(k\) 個可以得到的最大公因數。
考慮最大公因數的求法,在唯一分解定理之下其實就是對質因數的指數取 \(min\) 。
於是對所有數分解因數,找到出現次數大於 \(k\) 的因數即可,貪心取最大值。
程式碼
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T &x){ x=0;char ch=getchar();bool f=false; while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } template <typename T> inline void write(T x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10^48); return ; } const int N=1e5+5,M=1e6+5,MOD=1e9+7; #define ll long long #define ull unsigned long long #define inc(x,y) (x+y>=MOD?x+y-MOD:x+y) #define dec(x,y) (x-y<0?x-y+MOD:x-y) int n,k,ans; map<int,int>Map; int main(){ read(n),read(k); for(int i=1,x;i<=n;i++){ read(x); for(int j=1;j*j<=x;j++){ if(x%j==0) Map[j]++,Map[x/j]++; } } for(map<int,int>::iterator it=Map.begin();it!=Map.end();it++){ if((*it).second>=k) ans=max(ans,(*it).first); } write(ans); return 0; }