結果
問題 |
No.181 A↑↑N mod M
|
ユーザー |
![]() |
提出日時 | 2021-03-02 20:20:29 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 2,031 bytes |
コンパイル時間 | 1,904 ms |
コンパイル使用メモリ | 171,908 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-03 02:04:45 |
合計ジャッジ時間 | 3,247 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | AC * 37 |
ソースコード
#include <bits/stdc++.h> //#include <chrono> //#pragma GCC optimize("Ofast") using namespace std; #define reps(i,s,n) for(int i = s; i < n; i++) #define rep(i,n) reps(i,0,n) #define Rreps(i,n,e) for(int i = n - 1; i >= e; --i) #define Rrep(i,n) Rreps(i,n,0) #define ALL(a) a.begin(), a.end() using ll = long long; using vec = vector<ll>; using mat = vector<vec>; ll N,M,H,W,Q,K,A,B; string S; using P = pair<ll, ll>; const ll INF = (1LL<<60); template<class T> bool chmin(T &a, const T b){ if(a > b) {a = b; return true;} else return false; } template<class T> bool chmax(T &a, const T b){ if(a < b) {a = b; return true;} else return false; } template<class T> void my_printv(std::vector<T> v,bool endline = true){ if(!v.empty()){ for(std::size_t i{}; i<v.size()-1; ++i) std::cout<<v[i]<<" "; std::cout<<v.back(); } if(endline) std::cout<<std::endl; } ll gutyoku(ll n){ if(n == 0) return 1; else if(n >= 5) return 2002; ll pw = gutyoku(n - 1), res = 1; while(pw--){ if((res *= A) > 2000) return 2002; } return res; } ll solve(ll n, ll soko, ll mod){ if(n == 0) return 1; ll raw = gutyoku(n); if(raw < soko) return raw; if(mod == 1) return soko; vec As(1, 1), used(mod, -1); used[1] = 0; ll now = A % mod; while(used[now] == -1){ used[now] = (int)As.size(); As.push_back(now); (now *= A) %= mod; } ll pw = solve(n - 1, used[now], (int)As.size() - used[now]); ll res = pw < used[now] ? As[pw] : As[used[now] + (pw - used[now]) % ((int)As.size() - used[now])]; /* cout<<n<<' '<<soko<<' '<<mod<<" "<<res<<endl; //cout<<now<<' '<<pw<<' '<<res<<endl; my_printv(As); //my_printv(used); if(mod >= 426) cout<<used[426]<<endl; */ return (res < soko ? res + mod * soko : res); } int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); cin>>A>>N>>M; if(A == 1 || N == 0) cout<<(M != 1)<<endl; else cout<<solve(min(3000LL, N), 0, M)<<endl; }