結果
問題 | No.793 うし数列 2 |
ユーザー |
![]() |
提出日時 | 2019-02-22 23:57:24 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,105 bytes |
コンパイル時間 | 1,639 ms |
コンパイル使用メモリ | 165,648 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-11-26 03:23:27 |
合計ジャッジ時間 | 2,312 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 8 WA * 13 |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL MOD = 1000000007; int main() { // 1. 入力情報取得. LL N; cin >> N; // 2. N を 1000000007 で割った余りは? // 2-1. N を 2で割っていく. map<LL, LL> m; while(N){ LL q = N / 2; LL r = N % 2; m[q] = r; N /= 2; } // for(auto &p : m) cout << p.first << " " << p.second << endl; // 2-2. 2-1. の 結果から, 余りを逆算. LL ans = 1; LL bef = 0; LL counter = 0; for(auto &p : m){ if(p.first != 0) ans *= ans, ans %= MOD; if(p.second == 1) ans *= 10, ans %= MOD; } // ex. // 3, 30, 300, ..., 3 × {10 の (N - 1)乗}, 1 × (10 の N乗) の 合計は? // -> 等比級数の和: 3 × {(10 の N乗) - 1} / (10 - 1) = {(10 の N乗) - 1} / 3 // に, 1 × (10 の N乗) を加算すれば良いので, EN = {4 × (10 の N乗) - 1} / 3 と考えられる. ans = (4 * ans - 1) / 3; ans %= MOD; // 3. 後処理. cout << ans << endl; return 0; }