Wannafly挑战赛11_A_B_D
2018-03-13 20:34
441 查看
传送门
f
[m] = C(n-1,m-1)*an−mn−m*bm−1m−1;
接下来问题就转变为求这三项的值的乘积,后两项非常容易,快速幂就行,对于前面C(n-1,m-1),可以用到费马小定理求组合数(只需要将r!和(n-r)!用逆元的方法就可以解决)
A.白兔的分身术
思路:看完题目第一反应p=n,k=1,直接交一发。提交过程中思考了一下,显然取p=n,k=1最优。#include<bits/stdc++.h> #define debug(a) cout << #a << " " << a << endl #define LL long long #define PI acos(-1.0) #define eps 1e-6 const int N=1e5+7; using namespace std; int main () { //yyy_3y //freopen("1.in","r",stdin); LL n; scanf("%lld",&n); printf("%lld\n",n+1); return 0; }
B.白兔的式子
思路:其实我发现手推也很容易推出(实在不行就打表233),f
[m] = C(n-1,m-1)*an−mn−m*bm−1m−1;
接下来问题就转变为求这三项的值的乘积,后两项非常容易,快速幂就行,对于前面C(n-1,m-1),可以用到费马小定理求组合数(只需要将r!和(n-r)!用逆元的方法就可以解决)
#include<bits/stdc++.h> #define debug(a) cout << #a << " " << a << endl #define LL long long #define PI acos(-1.0) #define eps 1e-6 const int N=1e5+7; const LL mod =998244353; using namespace std; LL f ; LL my_pow(LL a,LL b) { LL ans=1; while(b){ if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } LL inv(LL a,LL b) { return my_pow(a,b-2); } LL C(LL n,LL m) { return f *inv(f[m],mod)%mod*inv(f[n-m],mod)%mod; } int main () { //yyy_3y //freopen("1.in","r",stdin); f[0]=1; for(int i=1;i<N;i++) f[i]=i*f[i-1]%mod; int T; scanf("%d",&T); for(int i=1;i<=T;i++){ int a,b,n,m; scanf("%d%d%d%d",&a,&b,&n,&m); LL a1=my_pow(a,n-m); LL b1=my_pow(b,m-1); printf("%lld\n",C(n-1,m-1)*a1%mod*b1%mod); } return 0; }
D—>bolg下一篇。
bc43相关文章推荐
- Wannafly 挑战赛11 B白兔的式子
- Wannafly挑战赛11 A-白兔的分身术
- Wannafly挑战赛11 B、白兔的式子
- Wannafly挑战赛11 B-白兔的式子
- wannafly挑战赛11----白兔的字符串
- Wannafly挑战赛11 白兔的式子
- Wannafly挑战赛11 D-白兔的字符串
- Wannafly挑战赛11 白兔的式子 (组合数取模)
- 【Wannafly挑战赛11】 A B【找规律+费马小定理】 D【字符串HASH】
- Wannafly挑战赛11-白兔的式子(组合数取模)
- Wannafly挑战赛11 D 白兔的字符串 (字符串hash)
- Wannafly挑战赛11 A B D【规律+逆元+字符串hash】
- Wannafly挑战赛11_D_白兔的字符串(字符串hash)
- Wannafly挑战赛11 -A 白兔的分身术
- Wannafly挑战赛11 - 白兔的分身术
- Wannafly挑战赛11 D 白兔的字符串 [Hash]
- Wannafly挑战赛11-C:白兔的棋盘(轮廓线DP)
- Wannafly挑战赛11 B 白兔的式子【阶乘逆元 + 预处理 + 板子】
- Wannafly挑战赛1:B-Xorto(前缀+思维)
- Wannafly挑战赛1 C MMSet2