HDU 6425 Rikka with Badminton(组合问题签到)题解
题意:问你有多少种选法使得不能满足大于等于2个拍子且大于等于1个球。
思路:数学组合问题,分类讨论一下,刚开始的时候分的很乱,写的乱七八糟的...还有注意MOD,基本上有大数相乘的地方都要先MOD一下,不然可能会溢出。
代码:
#include<set> #include<map> #include<cstdio> #include<utility> #include<cmath> #include<stack> #include<vector> #include<queue> #include<cstring> #include<string> #include<sstream> #include<iostream> #include<algorithm> #define ll long long #define ull unsigned long long using namespace std; const int maxn = 100+10; const int seed = 131; const int MOD = 998244353; const int INF = 0x3f3f3f3f; ll pow_mul(ll a,ll b){ ll ans = 1; while(b){ if(b & 1) ans = (ans * a) % MOD; a = (a * a) % MOD; b >>= 1; } return ans; } int main(){ int T; scanf("%d",&T); ll a,b,c,d,n; //都没,有拍,有球,都有 while(T--){ scanf("%lld%lld%lld%lld",&a,&b,&c,&d); ll ans = 0; if(b) ans = (ans + (pow_mul(2,a) * (pow_mul(2,b) - 1)) % MOD) % MOD; //只有拍 if(c) ans = (ans + (pow_mul(2,a) * (pow_mul(2,c) - 1)) % MOD) % MOD; //只有球 if(b && c) ans = (ans + ((pow_mul(2,a) * (pow_mul(2,c) - 1)) % MOD) * b) % MOD; //一拍N球 if(d) ans = (ans + (pow_mul(2,a + c) * d) % MOD) % MOD; //一拍N球 ans += pow_mul(2,a); //都没有 ans %= MOD; printf("%lld\n",ans); } return 0; }