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
| // 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include <bits/stdc++.h>
using namespace std;
struct Mat { long long a00, a01, a10, a11; };
static const long long MOD = 1000;
static inline Mat mul(const Mat& x, const Mat& y){
Mat r;
r.a00 = (x.a00 * y.a00 + x.a01 * y.a10) % MOD;
r.a01 = (x.a00 * y.a01 + x.a01 * y.a11) % MOD;
r.a10 = (x.a10 * y.a00 + x.a11 * y.a10) % MOD;
r.a11 = (x.a10 * y.a01 + x.a11 * y.a11) % MOD;
return r;
}
static Mat mpow(Mat base, long long exp){
Mat res{1,0,0,1};
while(exp>0){
if(exp&1) res = mul(res, base);
base = mul(base, base);
exp >>= 1;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; if(!(cin >> T)) return 0;
for(int tc=1; tc<=T; ++tc){
long long n; cin >> n;
long long s;
if(n==0){
s = 2 % MOD; // not used by constraints but kept for completeness
}else if(n==1){
s = 6 % MOD;
}else{
Mat A{6 % MOD, (MOD + (-4 % MOD)) % MOD, 1, 0};
Mat B = mpow(A, n-1);
s = (B.a00 * 6 + B.a01 * 2) % MOD; // [s_n, s_{n-1}]^T = B * [6,2]^T
}
long long ans = (s - 1) % MOD;
if(ans < 0) ans += MOD;
cout << "Case #" << tc << ": " << setw(3) << setfill('0') << ans << '\n';
}
return 0;
}
|