C - Rikka with Badminton --- HDU 6425 快速幂加组合数学

---恢复内容开始---

题目链接:

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 
#include 
#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\n", ans%mod);
    }
}
View Code

如有疑问,欢迎评论指出!

你可能感兴趣的:(C - Rikka with Badminton --- HDU 6425 快速幂加组合数学)