結果
| 問題 |
No.181 A↑↑N mod M
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-07-20 23:55:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,359 bytes |
| コンパイル時間 | 2,085 ms |
| コンパイル使用メモリ | 172,236 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 14:11:51 |
| 合計ジャッジ時間 | 2,880 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 31 WA * 6 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct stable_int{
long long v;
stable_int() : v(0) {}
stable_int(long long _v) : v(_v){}
stable_int& operator++() {
if(__builtin_add_overflow(v, 1, &v))v = std::numeric_limits<long long>::max();
return *this;
}
stable_int& operator--() {
if(__builtin_sub_overflow(v, 1, &v))v = std::numeric_limits<long long>::min();
return *this;
}
stable_int operator++(int) {
stable_int result = *this;
++*this;
return result;
}
stable_int operator--(int) {
stable_int result = *this;
--*this;
return result;
}
stable_int& operator+=(const stable_int& rhs) {
if(__builtin_add_overflow(v, rhs.v, &v))v = std::numeric_limits<long long>::max();
return *this;
}
stable_int& operator-=(const stable_int& rhs) {
if(__builtin_sub_overflow(v, rhs.v, &v))v = std::numeric_limits<long long>::min();
return *this;
}
stable_int& operator*=(const stable_int& rhs) {
long long pre = v;
if(__builtin_mul_overflow(v, rhs.v, &v)){
v = (pre > 0) ^ (rhs.v > 0) ? std::numeric_limits<long long>::min()
: std::numeric_limits<long long>::max();
}
return *this;
}
stable_int& operator/=(const stable_int& rhs) {
v /= rhs.v;
return *this ;
}
stable_int operator+() const { return *this; }
stable_int operator-() const { return stable_int() - *this; }
friend stable_int operator+(const stable_int& lhs, const stable_int& rhs) {
return stable_int(lhs) += rhs;
}
friend stable_int operator-(const stable_int& lhs, const stable_int& rhs) {
return stable_int(lhs) -= rhs;
}
friend stable_int operator*(const stable_int& lhs, const stable_int& rhs) {
return stable_int(lhs) *= rhs;
}
friend stable_int operator/(const stable_int& lhs, const stable_int& rhs) {
return stable_int(lhs) /= rhs;
}
friend bool operator==(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v == rhs.v);
}
friend bool operator!=(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v != rhs.v);
}
friend bool operator<(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v < rhs.v);
}
friend bool operator<=(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v <= rhs.v);
}
friend bool operator>(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v > rhs.v);
}
friend bool operator>=(const stable_int& lhs, const stable_int& rhs) {
return (lhs.v >= rhs.v);
}
friend istream& operator>>(istream& is,stable_int& rhs) noexcept {
long long _v;
rhs = stable_int{(is >> _v, _v)};
return is;
}
friend ostream& operator << (ostream &os, const stable_int& rhs) noexcept {
return os << rhs.v;
}
};
int main(){
int A, N, M;
cin >> A >> N >> M;
function<int(int, int, int)> rec = [&](int V, int N, int MOD){
if(N == 0)return 1;
if(MOD == 1)return 1000000;
vector<int> order, tb(MOD, -1);
int val = 1, tim = 0;
while(tb[val] == -1){
tb[val] = tim++;
order.push_back(val);
val *= V % MOD;
val %= MOD;
}
int EXP = rec(V, N - 1, (tim - tb[val]));
int idx = (EXP - tb[val]) % (tim - tb[val]) + tb[val];
return order[idx] + 1000 * MOD;
};
function<int(int, int, int)> rec2 = [&](int V, int N, int MOD){
if(N == 0)return 1;
if(MOD == 1)return 0;
vector<int> order, tb(MOD, -1);
int val = 1, tim = 0;
while(tb[val] == -1){
tb[val] = tim++;
order.push_back(val);
val *= V % MOD;
val %= MOD;
}
int EXP = rec2(V, N - 1, (tim - tb[val]));
stable_int v = 1, c = V;
while(EXP){
if(EXP & 1)v *= c;
c *= c;
EXP >>= 1;
}
return int(min(v.v, (long long)1 << 30));
};
int ans = rec(A, N, M) % M;
int ans2 = (N <= 5 ? rec2(A, N, M) : M + 500);
if(ans2 < M){
cout << ans2 << endl;
}else{
cout << ans << endl;
}
}