View difference between Paste ID: KAc2QuC8 and uS76SVWK
SHOW: | | - or go back to the newest paste.
1
#include <iostream>
2
#include <cstring>
3
#define MOD 1000000007
4
using namespace std;
5
int a[80][10][10], sol[10][10], mat[10][10], t, i, l, c, j;
6
long long n, p;
7
int main()
8
{
9
    cin >> t;
10-
    a[0][1][1] = a[0][3][3] = 3;
10+
    a[0][1][1] = -1;
11-
    a[0][1][2] = a[0][4][1] = 1;
11+
    a[0][3][3] = 3;
12-
    a[0][3][1] = -1;
12+
    a[0][1][2] = a[0][3][4] = 1;
13
    a[0][3][1] = 3;
14
    for(i = 0; (1LL<<i) <= 1000000000LL; i++)
15
    {
16
        for(l = 1; l <= 4; l++)
17
            for(c = 1; c <= 4; c++)
18
                for(j = 1; j <= 4; j++)
19
                {
20
                    a[i+1][l][c] += ((long long)a[i][l][j]*a[i][j][c])%MOD;
21
                    if(a[i+1][l][c] > MOD) a[i+1][l][c] -= MOD;
22
                }
23
    }
24
    while(t--)
25
    {
26
        cin >> n;
27
        p = n;
28
        memset(sol, 0, sizeof(sol));
29
        sol[1][1] = sol[2][2] = sol[3][3] = sol[4][4] = 1;
30
        for(i = 0; (1LL<<i) <= p; i++)
31
        if((1LL<<i)&p)
32
        {
33
            memset(mat, 0, sizeof(mat));
34
            for(l = 1; l <= 4; l++)
35
                for(c = 1; c <= 4; c++)
36
                    for(j = 1; j <= 4; j++)
37
                    {
38
                        mat[l][c] += ((long long)sol[l][j]*a[i][j][c])%MOD;
39
                        if(mat[l][c] > MOD) mat[l][c] -= MOD;
40
                    }
41
            memcpy(sol, mat, sizeof(mat));
42
        }
43
        cout << 4*sol[1][2] << "\n"; //MODULO!
44
45
    }
46
    return 0;
47
}
48
//
49
//4*3*3*3*2
50
//4*3*3*3*3*3=
51
//
52
//D[i] = prod[i-1] * 3 - D[i-1]
53
//
54
//(D[i], D[i-1], prod[i], prod[i-1]) *
55-
// 3 1 0 0
55+
// (12 4 12 4)
56-
// 0 0 0 0
56+
// -1 1 0 0
57-
//-1 0 3 0
57+
// 0  0 0 0
58-
// 0 0 0 1
58+
// 3  0 3 1
59
// 0  0 0 0
60
// (24 12 36 12)
61
//
62
//= (D[i+1] D[i] prod[i+1] prod[i])