---恢复内容开始---
题目链接:
https://vjudge.net/problem/1812693/origin
这题的mod运算很恶心,真的。。。
本题有正反两个思路,一个是正面求解其不能成立的情况,
一个是反面求解,用total减。
我用的是正面求解。
一共有种情况:
1. 全是球 :poww(2, a)*poww(2,c)-1
2. 全是拍 : poww(2, a)*poww(2, b)-1
3. 一拍多球(2种可能): 1 -- (poww(2, a)*poww(2, c)-1)*b(一个拍子!)
2 -- (poww(2, a)*poww(2,c)-1)*d
4. 啥也没 : poww(2, a)
加起来就好了, 由于数据很大,故而用到快速幂poww(我喜欢这样命名。。)
下面是AC代码:
#include <iostream> #include <cstdio> #define ll long long using namespace std; const int mod = 998244353; ll poww(ll a, ll b) { ll ans = 1, base = a; while(b) { if(b&1 != 0) ans = (ans%mod)*(base%mod); base = base%mod*base%mod; b >>= 1; } return ans%mod; } int main() { int T; scanf("%d", &T); while(T--) { ll ans = 0; ll a, b, c, d; scanf("%lld%lld%lld%lld", &a, &b, &c, &d); ans = (ans+(poww(2, a)*(poww(2, b)-1)%mod))%mod; //只有拍子 ans = (ans+(poww(2, a)*(poww(2, c)-1)%mod))%mod; //只有球 ans = (ans+(poww(2, a)*(poww(2, c)-1)%mod*b%mod))%mod; //一拍N球 ans = (ans+(poww(2, a)*(poww(2, c))%mod*d%mod))%mod; // 一拍N球 ans = (ans+poww(2, a)%mod)%mod; //啥也没 printf("%lld ", ans%mod); } }
如有疑问,欢迎评论指出!