Submission #10158


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
struct Matrix
{
vector< vector< int > > a;
Matrix(int N)
{
a.resize(N, vector< int >(N));
}
Matrix operator+(const Matrix &kj)
{
Matrix ret(a.size());
for(int i = 0; i < a.size(); i++) {
for(int j = 0; j < a.size(); j++) {
ret.a[i][j] = a[i][j] + kj.a[i][j];
ret.a[i][j] %= mod;
}
}
return (ret);
}
Matrix operator*(const Matrix &kj)
{
Matrix ret = Matrix::Zero(a.size());
for(int i = 0; i < a.size(); i++) {
for(int j = 0; j < a.size(); j++) {
for(int k = 0; k < a.size(); k++) {
ret.a[i][j] = (ret.a[i][j] + 1LL * a[i][k] * kj.a[k][j]) % mod;
}
}
}
return (ret);
}
Matrix operator^(long long n)
{
Matrix ret = Matrix::I(a.size());
Matrix x = *this;
while(n > 0) {
if(n & 1) (ret = ret * x);
x = x * x;
n >>= 1;
}
return (ret);
}
static Matrix Zero(int N)
{
Matrix ret(N);
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) ret.a[i][j] = 0;
}
return (ret);
}
static Matrix I(int N)
{
Matrix ret(N);
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) ret.a[i][j] = i == j;
}
return (ret);
}
};
// にゃー
int main()
{
Matrix tt(3);
tt.a = {{0, 1, 1},
{1, 0, 0},
{0, 1, 0}};
long long N;
cin >> N;
tt = tt ^ N;
cout << ((tt.a[2][0] * 2 % mod + tt.a[2][1]) % mod + tt.a[2][2]) % mod << endl;
}

ステータス

項目 データ
問題 0564 - 剣剣波(large)
ユーザー名 ei1333
投稿日時 2016-11-08 22:03:28
言語 C++11
状態 Accepted
得点 1
ソースコード長 1625 Byte
最大実行時間 24 ms
最大メモリ使用量 644 KB

セット

セット 得点 Cases
1 ALL 1 / 1 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
00.in AC 24 ms 480 KB
1
00sample.in AC 19 ms 464 KB
1
01.in AC 20 ms 444 KB
1
01sample.in AC 18 ms 428 KB
1
02.in AC 21 ms 416 KB
1
02sample.in AC 17 ms 532 KB
1
03.in AC 17 ms 644 KB
1
04.in AC 16 ms 632 KB
1
05.in AC 16 ms 484 KB
1
06.in AC 18 ms 460 KB
1
07.in AC 19 ms 440 KB
1