矩阵乘法 + 循环节 + 快速求幂
代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define ll __int64
void mul(ll a[][2], ll b[][2], ll mod) {
ll ans[2][2] = {
0, 0,
0, 0
};
for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) for(int k = 0; k < 2; k++) ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % mod;
for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) b[i][j] = ans[i][j];
}
ll f(ll n, ll mod) {
ll a[2][2] = {
3, 1,
1, 0
};
ll b[2][2] = {
1, 0,
0, 1
};
while(n >= 1) {
if(n & 1) mul(a, b, mod);
n >>= 1;
mul(a, a, mod);
}
return b[0][1] % mod;
}
int main() {
ll m1 = 1000000007;
ll m2 = 222222224;
ll m3 = 183120;
ll n;
while(scanf("%I64d", &n) != EOF) {
n = f(n, m3);
n = f(n, m2);
n = f(n, m1);
printf("%I64d\n", n);
}
return 0;
}