結果
| 問題 |
No.793 うし数列 2
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-02-23 00:03:42 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,363 bytes |
| コンパイル時間 | 1,814 ms |
| コンパイル使用メモリ | 166,648 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-26 06:18:56 |
| 合計ジャッジ時間 | 2,654 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 |
ソースコード
// 不要な変数を削除, コメント修正して, 再提出.
#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;
for(auto &p : m){
if(p.first != 0) ans *= ans, ans %= MOD;
if(p.second == 1) ans *= 10, ans %= MOD;
}
// ex.
// 合計が, EN と等しくなるはずである数列 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;
// -> 但し, 1/3 = 333333336 と読み替える必要がありそう(※03_random_01等 の WA回避用).
ans *= 4;
ans %= MOD;
ans--;
ans *= 333333336;
ans %= MOD;
// 3. 後処理.
cout << ans << endl;
return 0;
}
@abcde