結果
問題 | No.344 ある無理数の累乗 |
ユーザー |
|
提出日時 | 2017-08-14 00:17:21 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,121 bytes |
コンパイル時間 | 1,649 ms |
コンパイル使用メモリ | 166,960 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-13 09:23:56 |
合計ジャッジ時間 | 2,500 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 |
ソースコード
// {{{ Templates#include <bits/stdc++.h>#define show(x) cerr << #x << " = " << x << endlusing namespace std;using ll = long long;using pii = pair<int, int>;using vi = vector<int>;template <typename T>ostream& operator<<(ostream& os, const vector<T>& v){os << "sz:" << v.size() << "\n[";for (const auto& p : v) {os << p << ",";}os << "]\n";return os;}template <typename S, typename T>ostream& operator<<(ostream& os, const pair<S, T>& p){os << "(" << p.first << "," << p.second<< ")";return os;}constexpr ll MOD = (ll)1e3;template <typename T>constexpr T INF = numeric_limits<T>::max() / 100;// }}}struct Matrix {Matrix(){for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {table[i][j] = 0LL;}}}Matrix operator*(const Matrix& mat) const{Matrix ret;for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < 2; k++) {ret.table[i][j] += table[i][k] * mat.table[k][j];}ret.table[i][j] = ret.table[i][j] % MOD;}}return ret;}static Matrix unit(){Matrix ret;for (int i = 0; i < 2; i++) {ret.table[i][i] = 1LL;}return ret;}ll table[2][2];};Matrix power(const Matrix& mat, const ll n){if (n == 0) {return Matrix::unit();}if (n % 2 == 1) {return power(mat, n - 1) * mat;} else {const Matrix p = power(mat, n / 2);return p * p;}}int main(){cin.tie(0);ios::sync_with_stdio(false);ll n;cin >> n;if (n == 0) {cout << 1 << endl;return 0;}Matrix mat;mat.table[0][0] = 1;mat.table[0][1] = 3;mat.table[1][0] = 1;mat.table[1][1] = 1;const Matrix po = power(mat, n);const ll an = ((po.table[0][0] * 2) % MOD + MOD - ((n % 2 == 0) ? 1 : 0)) % MOD;cout << an << endl;return 0;}