http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1313
#include <cstdio>
#include <deque>
#include <set>
#include <string>
#include <map>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef long long LL;
const int mod = 10000;
struct matrix{
int mat[6][6];
};
matrix mul(matrix a,matrix b){
matrix ans;
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
ans.mat[i][j]=0;
for(int k=0;k<6;k++){
ans.mat[i][j] += a.mat[i][k]*b.mat[k][j];
ans.mat[i][j] %= mod;
}
}
}
return ans;
}
matrix matrixpow(matrix a,int n){
matrix ans;
memset(ans.mat,0,sizeof(ans.mat));
//ans.mat[0][0]=ans.mat[1][1]=1;
for(int i=0;i<6;i++){
ans.mat[i][i] = 1;
}
while(n){
if(n&1)ans=mul(ans,a);
a = mul(a,a);
n >>= 1;
}
return ans;
}
int f[6];
int ans[6];
int cas = 1;
void print(matrix a){
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
printf("%d ",a.mat[i][j]);
}
printf("\n");
}
}
void solve(int n){
memset(f,0,sizeof(f));
f[0] = 1;
matrix a;
memset(a.mat,0,sizeof(a.mat));
a.mat[0][1]=3,a.mat[0][2]=2,a.mat[0][3]=1;
a.mat[1][0]=1,a.mat[2][1]=1,a.mat[3][2]=1,a.mat[4][3]=1,a.mat[5][4]=1;
a = matrixpow(a,n);
for(int i=0;i<6;i++){
ans[i] = 0;
for(int j=0;j<6;j++){
ans[i] += a.mat[i][j]*f[j];
ans[i] %= mod;
}
}
//print(a);
int res = 0;
for(int i=0;i<6;i++){
// printf("%d ",ans[i]);
res += ans[i];
res %= mod;
}
res *= 2;
res %= mod;
printf("Case %d: %d\n",cas++,res);
}
int main(){
int n;
while(scanf("%d",&n)!=-1){
solve(n);
}
return 0;
}