Skip to content

Commit a44fa42

Browse files
Add files via upload
1 parent 08103d2 commit a44fa42

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#include <iostream>
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
const int MOD = 1e9 + 7, MAX_N = 1e6 + 5;
7+
long long factorial[MAX_N], inverse_factorial[MAX_N];
8+
9+
long long power_mod(long long x, long long power, long long m)
10+
{
11+
long long result = 1;
12+
13+
while(power > 0)
14+
{
15+
if(power%2 == 1)
16+
result = (result*x)%m;
17+
18+
x = (x*x)%m;
19+
power = power >> 1;
20+
}
21+
22+
return result;
23+
}
24+
25+
long long inverse(long long x, long long m)
26+
{
27+
return power_mod(x, m - 2, m);
28+
}
29+
30+
void precompute()
31+
{
32+
factorial[0] = 1;
33+
for(int i = 1; i < MAX_N; i++)
34+
{
35+
factorial[i] = (i*factorial[i - 1])%MOD;
36+
}
37+
38+
inverse_factorial[MAX_N - 1] = inverse(factorial[MAX_N - 1], MOD);
39+
for(int i = MAX_N - 2; i >= 0; i--)
40+
{
41+
inverse_factorial[i] = ((i + 1)*inverse_factorial[i + 1])%MOD;
42+
}
43+
}
44+
45+
long long choose(long long n, long long r)
46+
{
47+
long long numerator = factorial[n];
48+
long long inverse_denominator = (inverse_factorial[r]*inverse_factorial[n - r])%MOD;
49+
50+
return (numerator*inverse_denominator)%MOD;
51+
}
52+
53+
void solve()
54+
{
55+
long long no_of_moves, add_moves, range;
56+
cin >> no_of_moves >> add_moves >> range;
57+
58+
const int MOD = 1e9 + 7;
59+
long long score = 0;
60+
61+
if(add_moves == no_of_moves)
62+
{
63+
cout << (range*add_moves)%MOD << "\n";
64+
return;
65+
}
66+
67+
for(int i = 1; i <= add_moves; i++)
68+
{
69+
long long base_case = (i*range)%MOD;
70+
71+
long long total_moves = no_of_moves - i;
72+
long long total_free_moves = total_moves - 1;
73+
long long total_side_moves = add_moves - i;
74+
75+
base_case *= choose(total_free_moves, total_side_moves);
76+
base_case %= MOD;
77+
long long power_2 = power_mod(2, total_moves, MOD);
78+
79+
//cout << "i = " << i << " Number of paths = C(" << total_free_moves <<"," << total_side_moves << ") = " << choose(total_free_moves, total_side_moves) << " 2^i = " << power_2 << "\n";
80+
long long contribution = (base_case*inverse(power_2, MOD))%MOD;
81+
82+
score += contribution;
83+
score %= MOD;
84+
}
85+
cout << score << "\n";
86+
}
87+
88+
int main()
89+
{
90+
precompute();
91+
92+
int no_of_test_cases;
93+
cin >> no_of_test_cases;
94+
95+
while(no_of_test_cases--)
96+
solve();
97+
98+
return 0;
99+
}
100+

0 commit comments

Comments
 (0)