結果
| 問題 |
No.811 約数の個数の最大化
|
| コンテスト | |
| ユーザー |
izumo
|
| 提出日時 | 2019-04-12 22:22:43 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,183 bytes |
| コンパイル時間 | 1,689 ms |
| コンパイル使用メモリ | 170,196 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-14 20:03:16 |
| 合計ジャッジ時間 | 2,341 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 8 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define REP(i, n) for(int i=0; i<(n); ++i)
#define FOR(i, a, b) for(int i=(a); i<(b); ++i)
#define FORR(i, a, b) for(int i=(b)-1; i>=(a); --i)
#define DEBUG(x) cout<<#x<<": "<<x<<'\n'
#define DEBUG_VEC(v) cout<<#v<<":";REP(i, v.size())cout<<' '<<v[i];cout<<'\n'
#define ALL(a) (a).begin(), (a).end()
template<typename T> inline void CHMAX(T& a, const T b) {if(a<b) a=b;}
template<typename T> inline void CHMIN(T& a, const T b) {if(a>b) a=b;}
const ll MOD=1000000007ll;
// const ll MOD=998244353ll;
#define FIX(a) ((a)%MOD+MOD)%MOD
const double EPS=1e-11;
#define EQ0(x) (abs((x))<EPS)
#define EQ(a, b) (abs((a)-(b))<EPS)
const int MAX_N=114514;
// const int MAX_SQRT_B=1e9;
int prime[MAX_N];
bool is_prime[MAX_N+1];
// bool is_prime_small[MAX_SQRT_B];
// 素因数分解
vector<pii> prime_factor(int n){
vector<pii> res;
for(int i=2; i*i<=n; ++i){
if(n%i!=0){
continue;
}
int num=0;
while(n%i==0){
++num;
n/=i;
}
res.push_back(pii(i, num));
}
if(n!=1){
res.push_back(pii(n, 1));
}
return res;
}
// エラトステネスの篩
// is_prime[i]=true⇔iが素数
int sieve(int n){
int res=0;
REP(i, n+1){
is_prime[i]=true;
}
is_prime[0]=is_prime[1]=false;
FOR(i, 2, n+1){
if(is_prime[i]){
prime[res++]=i;
for(int j=2*i; j<=n; j+=i){
is_prime[j]=false;
}
}
}
return res;
}
int num[114514];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
// cout<<setprecision(10)<<fixed;
int n, k;
cin>>n>>k;
vector<pii> v=prime_factor(n);
int sz=sieve(n);
int idx=0, cnt=0, vsz=v.size(), ans=1;
while(cnt<k){
int itr=idx%vsz;
++idx;
if(v[itr].second==0){
continue;
}
++num[v[itr].first];
--v[itr].second;
ans*=v[itr].first;
++cnt;
}
int lim=sz;
REP(i, 30){
int idx=0, tmp=ans;
while(ans<n && idx<lim){
if(num[prime[idx]]==i){
ans*=prime[idx];
++num[prime[idx]];
}
++idx;
}
// DEBUG(ans);
if(ans>=n){
ans/=prime[idx-1];
}
lim=idx;
}
cout<<ans<<'\n';
return 0;
}
izumo