結果
問題 | No.251 大きな桁の復習問題(1) |
ユーザー |
![]() |
提出日時 | 2016-05-03 14:22:07 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 4 ms / 5,000 ms |
コード長 | 1,609 bytes |
コンパイル時間 | 1,479 ms |
コンパイル使用メモリ | 161,028 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-17 17:32:36 |
合計ジャッジ時間 | 2,078 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h>typedef long long ll;typedef unsigned long long ull;#define FOR(i,a,b) for(int (i)=(a);i<(b);i++)#define REP(i,n) FOR(i,0,n)#define RANGE(vec) (vec).begin(),(vec).end()using namespace std;long long mpow(long long a, long long k, long long M){long long b = 1LL;while (k > 0){if (k & 1LL)b = (b*a)%M;a = (a*a)%M;k >>= 1;}return b;}class BigDigitProblem{public:void solve(void){string N,M;cin>>N>>M;const ll Mod = 129402307;// Farmat Theorem より// N^M = N^(M%(Mod-1)) なので// N,M は N%Mod, M%(Mod-1) に置き換えられる// 後は高速ベキ乗計算ll n,m;n = m = 0;for (auto c : N){n *= 10;n += c-'0';n %= Mod;}for (auto c : M){m *= 10;m += c-'0';m %= (Mod-1);}if ( N == "0" ){assert(M != "0"); // 制約cout<<0<<endl;return;}if ( M == "0"){cout<<1<<endl;return;}if ( n == 0 ){cout<<0<<endl;return;}// log(M)cout<<mpow(n,m,Mod)<<endl;}};#if 1int main(int argc, char *argv[]){ios::sync_with_stdio(false);auto obj = new BigDigitProblem();obj->solve();delete obj;return 0;}#endif