---恢复内容开始---
题目链接:
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 = ; ll poww(ll a, ll b)
{
ll ans = , base = a;
while(b)
{
if(b& != )
ans = (ans%mod)*(base%mod);
base = base%mod*base%mod;
b >>= ;
}
return ans%mod;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
ll ans = ;
ll a, b, c, d;
scanf("%lld%lld%lld%lld", &a, &b, &c, &d); ans = (ans+(poww(, a)*(poww(, b)-)%mod))%mod; //只有拍子
ans = (ans+(poww(, a)*(poww(, c)-)%mod))%mod; //只有球
ans = (ans+(poww(, a)*(poww(, c)-)%mod*b%mod))%mod; //一拍N球
ans = (ans+(poww(, a)*(poww(, c))%mod*d%mod))%mod; // 一拍N球
ans = (ans+poww(, a)%mod)%mod; //啥也没 printf("%lld\n", ans%mod);
}
}
如有疑问,欢迎评论指出!