杭電多校第九場
阿新 • • 發佈:2018-12-24
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; } } } }