結果

問題 No.2365 Present of good number
ユーザー rieaaddlreiuurieaaddlreiuu
提出日時 2024-05-23 00:38:55
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 4,080 bytes
コンパイル時間 2,152 ms
コンパイル使用メモリ 186,752 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-05-23 00:39:00
合計ジャッジ時間 4,245 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 2 ms
6,940 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 WA -
testcase_20 WA -
testcase_21 AC 2 ms
6,944 KB
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 AC 2 ms
6,940 KB
testcase_27 AC 2 ms
6,940 KB
testcase_28 AC 2 ms
6,940 KB
testcase_29 AC 2 ms
6,944 KB
testcase_30 AC 2 ms
6,944 KB
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 AC 2 ms
6,940 KB
testcase_37 AC 2 ms
6,940 KB
testcase_38 AC 2 ms
6,940 KB
testcase_39 AC 2 ms
6,940 KB
testcase_40 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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

vector<int> decimal_to_binary(long long N){
    vector<int> result;
    while(N != 0){
        result.insert(result.begin(),N%2);
        N = N/2;
    }
    return result;
}

//a^n mod pの高速計算
//O(log p)
long long calc_modulo_p(long long a,long long n,long long p){
    a = a%p;
    n = n%(p-1);
    vector<int> binary = decimal_to_binary(n);
    long long x = a;
    long long result = 1;
    int N = binary.size();
    for(int i=0;i<N;i++){
        if(binary[N-1-i] == 1){
            result = (result * x)%p;
        }
        x = (x*x)%p;
    }
    return result;
}

//a^n mod pの高速計算(素数じゃなくてもできるver)
//O(log n)
long long calc_modulo_m(long long a,long long n,long long m){
    a = a%m;
    vector<int> binary = decimal_to_binary(n);
    long long x = a;
    long long result = 1;
    int N = binary.size();
    for(int i=0;i<N;i++){
        if(binary[N-1-i] == 1){
            result = (result * x)%m;
        }
        x = (x*x)%m;
    }
    return result;
}

vector<pair<long long, long long> > prime_factorize(long long N) {
    vector<pair<long long, long long> > res;
    for (long long p = 2; p * p <= N; ++p) {
        if (N % p != 0) {
            continue;
        }
        int e = 0;
        while (N % p == 0) {
            ++e;
            N /= p;
        }
        res.emplace_back(p, e);
    }
    if (N != 1) {
        res.emplace_back(N, 1);
    }
    return res;
}

void vector_output(vector<long long> v){
    cout << "{ ";
    for(int i=0;i<v.size();i++){
        cout << v[i] << " ";
    }
    cout << "}" << endl;
}

void vector_pair_output(vector<pair<long long,long long>> v){
    cout << "{ ";
    for(int i=0;i<v.size();i++){
        cout << "(" << v[i].first << "," << v[i].second << ")" << " ";
    }
    cout << "}" << endl;
}

void f(vector<long long> &P ,vector<long long> &X,vector<long long> &result_p ,vector<long long> &result_x){
    vector<pair<long long, long long>> result;
    vector<pair<long long, long long>> pairs;
    for(int i=0;i<P.size();i++){
        vector<pair<long long, long long>> work;
        work = prime_factorize(P[i]+1);
        for(int j=0;j<work.size();j++){
            work[j].second *= X[i];
        }
        pairs.insert(pairs.end(),work.begin(),work.end());
    }
    sort(pairs.begin(),pairs.end());
    long long sum = 0;
    for(int i=0;i<pairs.size();i++){
        if(i == 0 || pairs[i].first == pairs[i-1].first){
            sum += pairs[i].second;
        } else {
            result.emplace_back(pairs[i-1].first,sum);
            sum = pairs[i].second;
        }
    }
    result.emplace_back(pairs[pairs.size()-1].first,sum);
    for(int i=0;i<result.size();i++){
        result_p.push_back(result[i].first);
        result_x.push_back(result[i].second);
    }
    return;
}

int main(){
	long long N,K;
    long long prime = 1000000007;
    cin >> N >> K;
    vector<pair<long long, long long>> factor = prime_factorize(N);
    vector<long long> p,x,p0,x0;
    for(int i=0;i<factor.size();i++){
        p.push_back(factor[i].first);
        x.push_back(factor[i].second);
    }
    long long ans = 1;
    if(K <= 20){
        for(int i=0;i<K;i++){
            f(p,x,p0,x0);
            p.clear();
            x.clear();
            p = p0;
            x = x0;
            p0.clear();
            x0.clear();
        }
        for(int i=0;i<p.size();i++){
            ans = (ans * calc_modulo_p(p[i],x[i],prime))%prime;
        }
        cout << ans << endl;
        return 0;
    }
    long long s,r;
    f(p,x,p0,x0);
    if(K%2 == 1){
        s = (K-21)/2;
        r = calc_modulo_m(2,s,prime-1);
        for(int i=0;i<p0.size();i++){
            ans = (ans * calc_modulo_p(p0[i],x0[i],prime))%prime;
        }
        cout << calc_modulo_p(ans,r,prime) << endl;
    } else {
        s = (K-20)/2;
        r = calc_modulo_m(2,s,prime-1);
        for(int i=0;i<p.size();i++){
            ans = (ans * calc_modulo_p(p[i],x[i],prime))%prime;
        }
        cout << calc_modulo_p(ans,r,prime) << endl;
    }
}
0