結果
| 問題 |
No.2365 Present of good number
|
| コンテスト | |
| ユーザー |
rieaaddlreiuu
|
| 提出日時 | 2024-05-23 00:38:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,080 bytes |
| コンパイル時間 | 2,145 ms |
| コンパイル使用メモリ | 186,784 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-12-20 18:43:53 |
| 合計ジャッジ時間 | 3,637 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 14 WA * 25 |
ソースコード
#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;
}
}
rieaaddlreiuu