結果

問題 No.811 約数の個数の最大化
ユーザー Y17Y17
提出日時 2019-04-12 22:11:08
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 44 ms / 2,000 ms
コード長 1,980 bytes
コンパイル時間 1,874 ms
コンパイル使用メモリ 147,624 KB
実行使用メモリ 4,356 KB
最終ジャッジ日時 2023-10-12 20:49:59
合計ジャッジ時間 2,271 ms
ジャッジサーバーID
(参考情報)
judge11 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,352 KB
testcase_01 AC 2 ms
4,352 KB
testcase_02 AC 40 ms
4,352 KB
testcase_03 AC 2 ms
4,352 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 2 ms
4,348 KB
testcase_06 AC 4 ms
4,352 KB
testcase_07 AC 5 ms
4,352 KB
testcase_08 AC 19 ms
4,348 KB
testcase_09 AC 19 ms
4,352 KB
testcase_10 AC 13 ms
4,352 KB
testcase_11 AC 37 ms
4,348 KB
testcase_12 AC 11 ms
4,356 KB
testcase_13 AC 44 ms
4,348 KB
testcase_14 AC 44 ms
4,348 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

int sotbl[100010] = {};
vector<int> so;

int main(){
    int n, k;
    cin >> n >> k;

    for(int i = 2;i*i <= n;i++){
        if(sotbl[i] == 0){
            so.push_back(i);
            for(int j = i*2;j <= n;j+=i){
                sotbl[j] = 1;
            }
        }
    }

    int i = 0;
    vector<int> soin;
    int nn = n;
    while(n > 1){
        if(n % so[i] == 0){
            soin.push_back(so[i]);
            n /= so[i];
        }else{
            i++;
            if(i == so.size()){
                soin.push_back(n);
                break;
            }
        }
    }

    int ans = 0;
    int ans_yaku = 0;

    for(int i = 2;i < nn;i++){
        vector<int> sonum;
        int j = 0;
        n = i;
        while(n > 1){
            if(n % so[j] == 0){
                sonum.push_back(so[j]);
                n /= so[j];
            }else{
                j++;
                if(j == so.size()){
                    sonum.push_back(n);
                    break;
                }
            }
        }


        int cnt = 0;
        int x = 0, y = 0;
        while(x < soin.size() && y < sonum.size()){
            if(soin[x] == sonum[y]){
                cnt++;
                x++;
                y++;
            }else if(soin[x] > sonum[y]){
                y++;
            }else{
                x++;
            }
        }

        if(cnt >= k){
            int tmp = 0;
            int tcnt = 0;
            int tans = 1;
            for(int i = 0;i < sonum.size();i++){
                if(tmp != sonum[i]){
                    tans *= tcnt+1;
                    tcnt = 1;
                    tmp = sonum[i];
                }else{
                    tcnt++;
                }
            }

            tans = (tans*(tcnt+1))-1;
            if(tans > ans_yaku){
                ans = i;
                ans_yaku = tans;
            }
        }
    }

    cout << ans << endl;

    return 0;
}
0