Wannafly挑战赛11 B 白兔的式子【阶乘逆元 + 预处理 + 板子】
2018-03-10 22:30
471 查看
题目描述
已知f[1][1]=1,f[i][j]=a*f[i-1][j]+b*f[i-1][j-1] (i>=2,1<=j<=i)。 对于其他情况f[i][j]=0 有T组询问,每次给出a,b,n,m,求f[n][m] mod (998244353)
输入描述:
第一行为一个整数T,表示询问个数。 接下来一共T行,每行四个整数a,b,n,m。
输出描述:
一共T行,每行一个整数,表示f[n][m] mod (998244353)
示例1
输入
22 3 3 3
3 1 4 1
输出
927
备注:
T<=1000001<=m<=n<=100000
0<=a,b<=109
题意: 略
分析: 按照递推公式在图上画之后,可以将转化成 求(a+b)n(a+b)n的
m - 1项,其实就是求Cmnan−mbm−1Cnman−mbm−1,其中CmnCnm我们可以预处理出来即可,这里逆元用到快速幂取模,这里阶乘逆元即做板子吧
参考代码
#include <bits/stdc++.h> using namespace std; const int MOD = 998244353,maxn = 1e5 + 10; typedef long long ll; #define mod(x) (x) % MOD ll fac[maxn + 10]; ll rfac[maxn + 10]; ll qpow(ll a, ll b) { ll res = 1; while (b) { if(b & 1) res = mod(res * a); a = mod(a * a); b >>= 1; } return res; } int main() { fac[0] = 1; for (int i = 1; i <= maxn; i++) fac[i] = mod(fac[i - 1] * i); rfac[maxn] = qpow(fac[maxn],MOD - 2); for (int i = maxn;i > 0; i--) { rfac[i - 1] = mod(rfac[i] * i); } int T;cin>>T; while (T--) { ll a,b,n,m;cin>>a>>b>>n>>m; n--; m--; ll res = mod(mod(mod(mod(qpow(a,n - m)*qpow(b,m)) * fac ) * rfac[m]) * rfac[n - m]); cout<<mod(res + MOD)<<endl; } return 0; }
相关文章推荐
- Wannafly 挑战赛11 B白兔的式子
- Wannafly挑战赛11 B、白兔的式子
- Wannafly挑战赛11 白兔的式子
- Wannafly挑战赛11-白兔的式子(组合数取模)
- Wannafly挑战赛11 白兔的式子 (组合数取模)
- Wannafly挑战赛11 B-白兔的式子
- Wannafly挑战赛11 D-白兔的字符串
- wannafly挑战赛11----白兔的字符串
- Wannafly挑战赛11 - 白兔的分身术
- Wannafly挑战赛11_D_白兔的字符串(字符串hash)
- Wannafly挑战赛11-C:白兔的棋盘(轮廓线DP)
- 牛客网Wannafly挑战赛11--白兔的式子
- Wannafly挑战赛11 D 白兔的字符串 (字符串hash)
- Wannafly挑战赛11 D 白兔的字符串 [Hash]
- Wannafly挑战赛11 A B D【规律+逆元+字符串hash】
- Wannafly挑战赛11 -A 白兔的分身术
- Wannafly挑战赛11 A-白兔的分身术
- 【Wannafly挑战赛11】 A B【找规律+费马小定理】 D【字符串HASH】
- HDU6044 Limited Permutation (递归,预处理阶乘逆元)
- 白兔的式子(卢卡斯定理+费马小定理求逆元)