k题题意
一天你去打羽毛球 遇见a,b,c,d四种人。
a是白条哥啥都没有,b只有拍子,c只有球,d有一个拍子一个球。
pop(a+b+c+d)=n pop是人数
你现在想打羽毛球,从这四种人中任意挑人打比赛,要求至少有两个拍子一个球,可以任意个人。。。
问在所有情况中 有多少种情况我打不了羽毛球。。。。
思路
第一种 每种人打球的情况是2^x.
所以若只考虑a和b 则有2^(a+b)中可能
第二种 考虑上c了 就是2^(a+c)*(b+1) 这里为什么是乘以b+1呢?
b种人只能去一个人或者没有b去 因为只能有一个拍子或者没有拍子。
但是这样子会和第一种重了,就是c没人去,b去一个或者不去 所以第二种要减去2^a*(b+1)
第三种 考虑上d了,就是2^c*d
这个题要用快速幂
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
const int maxn = 1001, inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const ll mod = 998244353;
ll quick(ll a, ll b)
{
ll ans = 1;
a = a % mod;
while (b != 0)
{
if (b & 1) ans = (ans * a) % mod;
b >>= 1;
a = (a*a) % mod;
}
return ans;
}
int main()
{
int t;
ll a, b, c, d;
scanf("%d", &t);
while (t--)
{
cin >> a >> b >> c >> d;
ll ans = quick(2, a)*quick(2, b) % mod;
ans = (ans + ((quick(2, a + c) - quick(2, a) +mod) % mod*(1 + b)) % mod) % mod;
ans = (ans + (quick(2, a + c)*d%mod)) % mod;
printf("%lld\n", ans);
}
return 0;
}
题意:A分别有a1,b1,c1个剪刀,石头,布,B分别有a2,b2,c2个剪刀,石头,布,B胜A获得一分,平手不得不失,B输A失去一分,求B得到最大分数的期望
分析:B要获得最大分数,则在A出剪刀的时候B一定要出石头,此时B可以得到胜A的分数但是同时会失去A可能出布失去的分数
则A出剪刀时B得分的期望是:b2*a1/(a1+b1+c1) - b2*c1/(a1+b1+c1) 依次类推
所以B获胜的期望是:(a1*b2-b2*c1+b1*c2-a1*c2+a2*c1-a2*b)/(a1+b1+c1)
CODE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll a1, b1, c1, a2, b2, c2;
ll gcd(ll a, ll b)
{
if (b == 0)return a;
return gcd(b, a%b);
}
int main()
{
ios::sync_with_stdio(0);
int t;
cin >> t;
while (t--)
{
cin >> a1 >> b1 >> c1;
cin >> a2 >> b2 >> c2;
ll getup = (a1*b2 - b2 * c1 + b1 * c2 - a1 * c2 + a2 * c1 - a2 * b1);
ll getdown = a1 + b1 + c1;
if (getup%getdown == 0)
cout << getup / getdown << endl;
else
{
if (getup < 0) { //注意求最大公约数时数为负数的情况
cout << getup / gcd(-getup, getdown) << "/" << getdown / gcd(-getup, getdown) << endl;
}
else {
cout << getup / gcd(getup, getdown) << "/" << getdown / gcd(getup, getdown) << endl;
}
}
}
}