Skip to content

Commit 8fd8987

Browse files
Add files via upload
1 parent 60ecdfa commit 8fd8987

File tree

1 file changed

+98
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)