結果
| 問題 |
No.811 約数の個数の最大化
|
| コンテスト | |
| ユーザー |
ahe100
|
| 提出日時 | 2019-04-12 22:55:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,060 bytes |
| コンパイル時間 | 1,819 ms |
| コンパイル使用メモリ | 172,508 KB |
| 実行使用メモリ | 26,240 KB |
| 最終ジャッジ日時 | 2024-09-15 06:03:03 |
| 合計ジャッジ時間 | 9,694 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 3 |
| other | RE * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0;i<((int)(n));i++)
#define reg(i,a,b) for(int i = ((int)(a));i<=((int)(b));i++)
#define irep(i,n) for(int i = ((int)(n)-1);i>=0;i--)
#define ireg(i,a,b) for(int i = ((int)(b));i>=((int)(a));i--)
typedef long long ll;
/*
*/
struct D{
ll val,num,id;
};
bool operator<(const D &l, const D &r){//全順序を定めないと,{1,0,0}=={1,1,0}
if(l.num > r.num){
return true;
}else if(l.num == r.num){
if(l.val > r.val){
return true;
}else if(l.val == r.val){
return l.id > r.id;
}
}
return false;
}
ll n,k,m;
//2からprob_sizeまでの全ての数の素因数分解(ただし重複無視)を返す
const ll prob_size=300000;//ここの100000は発生する数の範囲
vector<ll> fact[300010],pri;
ll visited[prob_size]={}, a[100010]={},nu[100010],ans=1;
//nまでの素数表を返す
void prime(ll n, vector<ll>& p){
ll visited[300010]={};
reg(i,2,n){
if(visited[i]==0){
p.push_back(i);
reg(j,2,n){
if(j*i>n)break;
visited[i*j]=1;
}
}
}
}
void init(){
cin>>n>>k;
reg(i,2,prob_size){
if(visited[i]==0){
reg(j,1,prob_size){
if(j*i>prob_size)break;
visited[i*j]=1;
fact[i*j].push_back(i);//素因数リスト(重複は含まず)
}
}
}
prime(n,pri);
rep(i,pri.size())nu[pri[i]]=i;
m=n;
cerr<<"初期化終了"<<endl;
}
int main(void){
init();
//fact[n]からk個選び、その後は好きな数を掛ける
a[0]=0;//???????????????????
while(k>0){
rep(i,fact[n].size()){
if(m%fact[n][i]==0){
m/=fact[n][i];
ans*=fact[n][i];
a[nu[fact[n][i]]]++;
// cerr<<a[nu[fact[n][i]]]<<endl;
k--;
}
if(k==0)break;
}
}
//ここから最小の奴にいれていく
priority_queue<D>Q;
rep(i,pri.size()){
Q.push({pri[i],a[i],i});
// cerr<<pri[i]<<"="<<a[i]<<" ";
}
// cerr<<endl;
// cerr<<"本番"<<endl;
//下から埋める
while(!Q.empty()){
D p = Q.top();Q.pop();
if(ans*p.val<n){
ans*=p.val;
p.num++;
Q.push(p);
}
}
cout<<ans<<endl;
return 0;
}
ahe100