题目大意:
答案一定是一个有理数,以n=p·q-1的形式并模上998244353给出。 q-1 表示q的逆元,可以用扩欧或费马小定理来算。
如果p是一个质数,而整数a不是p的倍数,则有a(p-1)≡1(mod p)
费马小定理
有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是显然地。然后,收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解,它可以用来计算模反元素(也叫模逆元)。
扩展欧几里得算法
#include<bits/stdc++.h> using namespace std; typedef long long ll; int const LIM = 2e6 + 5; int const MOD = 998244353; ll n; ll fac[LIM]; ll qmod(ll x, ll y) { ll res = 1; while (y) { if(y & 1) res = (1ll * res * x) % MOD; y >>= 1; x = (1ll * x * x) % MOD; } return res; } int main() { fac[0] = 1; for(ll i = 1; i < LIM; i++) fac[i] = (1ll * fac[i-1] * i) % MOD; while (cin >> n) printf("%lld\n", (1ll * fac[n] * fac[n]) % MOD * qmod(fac[2*n+1], MOD - 2) % MOD); return 0; }
评论
还没有任何评论,你来说两句吧!