Skip to content

Commit 60ecdfa

Browse files
Add files via upload
1 parent 526e2a7 commit 60ecdfa

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include <cstdio>
2+
3+
const int N = 2, MOD = 1e9 + 7;
4+
5+
void load_identity(long long I[N][N])
6+
{
7+
for(int i = 0; i < N; i++)
8+
for(int j = 0; j < N; j++)
9+
I[i][j] = (i == j ? 1 : 0);
10+
}
11+
12+
void copy(long long A[N][N], long long B[N][N])
13+
{
14+
for(int i = 0; i < N; i++)
15+
for(int j = 0; j < N; j++)
16+
B[i][j] = A[i][j];
17+
}
18+
19+
void multiply(long long A[N][N], long long B[N][N])
20+
{
21+
long long P[N][N];
22+
23+
for(int row = 0; row < N; row++)
24+
{
25+
for(int column = 0; column < N; column++)
26+
{
27+
P[row][column] = 0;
28+
29+
for(int i = 0; i < N; i++)
30+
P[row][column] += (A[row][i]*B[i][column])%MOD;
31+
32+
P[row][column] %= MOD;
33+
}
34+
}
35+
36+
copy(P, A);
37+
}
38+
39+
void power(long long X[N][N], long long power)
40+
{
41+
long long result[N][N];
42+
load_identity(result);
43+
44+
while(power)
45+
{
46+
if(power%2 == 1)
47+
multiply(result, X);
48+
49+
multiply(X, X);
50+
power = power >> 1;
51+
}
52+
53+
copy(result, X);
54+
}
55+
56+
long long fibo(long long n)
57+
{
58+
long long fibonacci[N][N] = { {1, 0} };
59+
long long matrix[N][N] = { {1, 1},
60+
{1, 0} };
61+
62+
63+
if(n <= 1)
64+
return n;
65+
66+
power(matrix, n - 1);
67+
multiply(fibonacci, matrix);
68+
69+
return fibonacci[0][0];
70+
}
71+
72+
void solve()
73+
{
74+
long long n, m;
75+
scanf("%lld %lld", &n, &m);
76+
77+
long long n_sum = fibo(n + 1) + MOD - 1;
78+
long long m_sum = fibo(m + 2) + MOD - 1;
79+
80+
long long total = (m_sum + MOD - n_sum)%MOD;
81+
printf("%lld\n", total);
82+
}
83+
84+
int main()
85+
{
86+
int no_of_test_cases;
87+
scanf("%d", &no_of_test_cases);
88+
89+
while(no_of_test_cases--)
90+
solve();
91+
92+
return 0;
93+
}

0 commit comments

Comments
 (0)