|
| 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