int main(){ const ll MOD = 1e9 + 7; ll n; scanf("%lld", &n); std::vector<ll> fact(2 * n + 1, 1); for(ll p = 2; p <= 2 * n; p++){fact[p] = p * fact[p - 1] % MOD;} std::vector<ll> modInv(n + 2, 1); for(ll p = 2; p <= n + 1; p++){modInv[p] = (MOD - ((MOD / p) * modInv[MOD % p] % MOD)) % MOD;} ll cur(1), ans(0); for(ll k = 1; k <= n + 1; k++){ cur *= ((n + k) * modInv[k] % MOD); cur %= MOD; ans += cur; ans %= MOD; } printf("%lld\n", ans); return 0; }
void SecretShare::computeLagrangeWeight(){ mpz_t nom, denom, t1, t2, temp; mpz_init(nom); mpz_init(denom); mpz_init(t1); mpz_init(t2); mpz_init(temp); lagrangeWeight = (mpz_t*)malloc(sizeof(mpz_t) * peers); for(int i = 0; i < peers; i++) mpz_init(lagrangeWeight[i]); for(int peer = 0; peer < peers; peer++){ int point = peer+1; mpz_set_ui(nom,1); mpz_set_ui(denom,1); for(int l = 0; l < peers; l++){ if(l != peer){ mpz_set_ui(t1, l+1); modMul(nom, nom, t1); mpz_set_ui(t2, point); modSub(temp, t1, t2); modMul(denom, denom, temp); } } modInv(temp, denom); modMul(lagrangeWeight[peer], nom, temp); } mpz_clear(nom); mpz_clear(denom); mpz_clear(t1); mpz_clear(t2); mpz_clear(temp); }
void SecretShare::modInv(mpz_t* result, mpz_t* values, int size){ for(int i = 0; i < size; i++) modInv(result[i],values[i]); }
static Long divide(Long a, Long b) { return a * modInv(b, MOD) % MOD; }