Problem:
Score : 600 points

Problem Statement

Consider the following arithmetic progression with n terms:

x, x + d, x + 2d, \ldots, x + (n-1)d

What is the product of all terms in this sequence?
Compute the answer modulo 1\ 000\ 003.

You are given Q queries of this form.
In the i-th query, compute the answer in case x = x_i, d = d_i, n = n_i.

Constraints

1 \leq Q \leq 10^5

0 \leq x_i, d_i \leq 1\ 000\ 002

1 \leq n_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

Q
x_1 d_1 n_1
:
x_Q d_Q n_Q

Output

Print Q lines.

In the i-th line, print the answer for the i-th query.

Sample Input 1

2
7 2 4
12345 67890 2019

Sample Output 1

9009
916936

For the first query, the answer is 7 \times 9 \times 11 \times 13 = 9009.
Don't forget to compute the answer modulo 1\ 000\ 003.

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef pair<ll, ll> pll;

#define FOR(i, n, m) for (ll(i) = (m); (i) < (n); ++(i))
#define REP(i, n) FOR(i, n, 0)
#define OF64 std::setprecision(10)

const ll MOD = 1000003;
const ll INF = (ll)1e15;

int main()
{
    ll P = 1;
    FOR(i, MOD, 1)
    {
        P *= i;
        P %= MOD;
    }
    ll Q;
    cin >> Q;
    REP(i, Q)
    {
        ll x, d, n;
        cin >> x >> d >> n;
        if (d > 0 && n >= MOD)
        {
            cout << 0 << endl;
            continue;
        }
        else if (d == 0)
        {
            ll a = 1;
            ll y = x;
            FOR(j, 40, 0)
            {
                if (((n >> j) & 1) == 1)
                {
                    a *= y;
                    a %= MOD;
                }
                y = (y * y) % MOD;
            }
            cout << a << endl;
            continue;
        }
        else if ((MOD - x) % d == 0)
        {
            ll m = (MOD - x) / d;
            if (m <= n - 1)
            {
                cout << 0 << endl;
                continue;
            }
        }

        //! d>0 && n<MOD
        ll a = 1;
        REP(j, n)
        {
            a *= (x + j * d) % MOD;
            a %= MOD;
        }
        cout << a << endl;
    }
    return 0;
}