《如 何 速 通 一 套 题》5.0

邮寄

开场直接看 A。A 做不出来。

浏览了一下,发现 A 是 sb 题,直接做了。

BCD 全都不会做。

推了好久的 B,想出来了,然后写过了。

CD 一个暴力,一个乱搞,然后撤退。

A 依依寺

a 没用,对 bc 分类讨论。

死于不开 long long 见祖宗。

#include <bits/stdc++.h>
using namespace std;
int t, a, b, c, ans;
int main() {
//freopen("yiyi.in", "r", stdin);
//freopen("yiyi.out", "w", stdout);
for(cin >> t; t--; ) {
cin >> a >> b >> c;
ans = 0;
if((!b) && (!c)) {
cout << "Second" << '\n';
continue;
}
if(b) {
b--;
ans |= (b <= c) ^ (a & 1);
b++;
}
if(c) {
c--;
ans |= (c <= b) ^ (a & 1);
c++;
}
cout << (ans? "First" : "Second") << '\n';
}
return 0;
}

B 武义寺

考虑每一个 val 的可能取值。

对于取值为 i 的情况,前 i1 个数必须满足 jaj,第 i 个数必须满足 i>ai,其他随便。

先考虑第一个条件。

pbsi 表示 前 i 个数满足 jaj 的概率,从后往前看,易得 pbsi=(ni+1)i×(ni)!n!

然后考虑第二个条件。可知 val(p)=i 的概率是 pbsi1pbsi

然后就可以直接做了。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int kMod = 998244353;
int n, fac[1000010], ivs[1000010], inv[1000010], pbs[1000010], prb[1000010], ans;
int qpow(int x, int y) {
int rs = 1;
for(; y; y >>= 1) {
if(y & 1) {
rs = rs * x % kMod;
}
x = x * x % kMod;
}
return rs;
}
int qinv(int x) {
return qpow(x, kMod - 2);
}
void init() {
fac[0] = 1;
for(int i = 1; i <= 1000000; i++) {
fac[i] = fac[i - 1] * i % kMod;
}
ivs[1000000] = qinv(fac[1000000]);
for(int i = 999999; i >= 0; i--) {
ivs[i] = ivs[i + 1] * (i + 1) % kMod;
}
for(int i = 1; i <= 1000000; i++) {
inv[i] = ivs[i] * fac[i - 1] % kMod;
}
}
signed main() {
//freopen("wuyi.in", "r", stdin);
//freopen("wuyi.out", "w", stdout);
init();
cin >> n;
pbs[0] = 1;
for(int i = 1; i <= n; i++) {
pbs[i] = qpow(n - i + 1, i) * fac[n - i] % kMod * ivs[n] % kMod;
}
for(int i = 1; i <= n + 1; i++) {
prb[i] = (pbs[i - 1] - pbs[i] + kMod) % kMod;
ans = (ans + i * prb[i]) % kMod;
}
cout << ans << '\n';
return 0;
}

C 依久依久

超级大数学。

区间复杂东西的复杂运算,可差分,果断祭出前缀和。

对于 l=1,不难想到一位一位处理。

找到 n 的最高位,设是第 k 位,对应的数是 fibk。我们把这一位的贡献算上,然后递归处理。

写出来就是:

S(n)=S(fibk1)  S(nfibk)  {fibkif nfibk+1 is odd0otherwise

// 实际写出来的代码短得神奇
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t, l, r, ans, f[114], n;
map<int, int> mem;
int cal(int x) {
if(!x) {
return 0;
}
if(mem.find(x) != mem.end()) {
return mem[x];
}
int tmp = upper_bound(f + 1, f + n + 1, x) - f - 1;
return mem[x] = (cal(f[tmp] - 1) ^ cal(x - f[tmp]) ^ (((x - f[tmp] + 1) & 1) * f[tmp]));
}
signed main() {
freopen("yijiu.in", "r", stdin);
freopen("yijiu.out", "w", stdout);
f[0] = f[1] = 1;
for(n = 2; (f[n] = f[n - 1] + f[n - 2]) <= (int)(1e18); n++) {
}
for(cin >> t; t--; ) {
cin >> l >> r;
cout << (cal(r) ^ cal(l - 1)) << '\n';
}
return 0;
}
posted @   hhc0001  阅读(30)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示