Challenge: Summing the K-N-R Series

Subdomeniu: Algebra (algebra)

Scor cont: 80.0 / 80

Submission status: Accepted

Submission score: 1.0

Submission ID: 464763207

Limbaj: cpp14

Link challenge: https://www.hackerrank.com/challenges/summing-the-k-n-r-series/problem

Cerinta

You are given a sequence whose $n^{\text{th}}$ term is  
$$T_n = n^K \times R^n$$
You have to evaluate the series
$$S_n = T_1 + T_2 + T_3 + \cdots + T_n$$
Find $S_n \bmod (10^9+7)$.

**Input Format**  

The first line of input contains $T$, the number of test cases.  
Each test case consists of three lines, each containing $K$, $n$ and $R$ respectively.  

**Output Format** 

For each test case, print the required answer in a line.  

**Constraints**  

$1 \le T \le 10$  
$1 \le K \le 10^{3}$  
$1 \le n \le 10^{16}$  
$2 \le R \le 10^{16}$  
$R\bmod (10^9 + 7) \not= 1$  

**Sample Input**  

	2
    2
    5
    2
    3
    4
    3
    
**Sample Output**  

	1146
    5988

**Explanation**  

Case 1: $1146 =  1^2\times 2^1   +   2^2\times 2^2   +   3^2\times 2^3   +   4^2\times 2^4   +   5^2\times 2^5$  
Case 2: $5988 = 1^3\times 3^1   +   2^3\times 3^2   +   3^3\times 3^3   +   4^3\times 3^4$

Cod sursa

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

static const long long MOD = 1000000007LL;

long long modpow(long long a, long long e) {
    long long r = 1 % MOD;
    a %= MOD;
    if (a < 0) a += MOD;
    while (e > 0) {
        if (e & 1LL) r = (__int128)r * a % MOD;
        a = (__int128)a * a % MOD;
        e >>= 1LL;
    }
    return r;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int K;
        long long n, R;
        cin >> K >> n >> R;

        long long r = R % MOD;
        long long invr = modpow(r, MOD - 2);
        long long den = (1 - invr) % MOD;
        if (den < 0) den += MOD;
        long long invDen = modpow(den, MOD - 2);

        vector<vector<long long>> C(K + 1, vector<long long>(K + 1, 0));
        for (int i = 0; i <= K; ++i) {
            C[i][0] = C[i][i] = 1;
            for (int j = 1; j < i; ++j) {
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
                if (C[i][j] >= MOD) C[i][j] -= MOD;
            }
        }

        vector<long long> b(K + 1, 0); // P(x)=sum b[j] x^j
        for (int t = K; t >= 0; --t) {
            long long s = 0;
            for (int j = t + 1; j <= K; ++j) {
                long long coef = C[j][t];
                if ((j - t) & 1) coef = (MOD - coef) % MOD;
                s = (s + (__int128)b[j] * coef) % MOD;
            }
            long long rhs = (t == K ? 1 : 0);
            long long val = (rhs + (__int128)invr * s) % MOD;
            b[t] = (__int128)val * invDen % MOD;
        }

        long long nmod = n % MOD;
        long long pval = 0;
        long long pw = 1;
        for (int j = 0; j <= K; ++j) {
            pval = (pval + (__int128)b[j] * pw) % MOD;
            pw = (__int128)pw * nmod % MOD;
        }

        long long rn = modpow(r, n);
        long long ans = ((__int128)rn * pval - b[0]) % MOD;
        if (ans < 0) ans += MOD;
        cout << ans << '\n';
    }

    return 0;
}
HackerRank Algebra – Summing the K-N-R Series