「比赛总结」洛谷 10 月赛

📄 PDF 📝 Source

洛谷 2020 年 10 月 月赛 有两道期望题分数拿的还不错 .

Pro. A

给出一张无向图,从任意一点出发,规定每条边只能经过一次(正向 反向都算一次)。求最长的合法路径长度。

考虑每次经过一个点 x ,就会使点 x 的可用度数减 2 。如果走到一个合法度数为 0 的点,那么路径终止。要求是求最长路径长度,那么显然应该以此减少每个点的可用度数。每个点的初始度数为 n - 1。特殊考虑有偶数个点的完全图,初始度数为奇数,那么最后一次仍然可以走一步到达一个点。

n12×n+[n mod 2 = 0] \frac{n-1}{2} \times n + [n\ \texttt{mod}\ 2\ =\ 0]

code

# python3 
T = int(input())
for i in range(T):
    now = int(input())
    print((now - 1) // 2 * now + ((now & 1) ^ 1))

Pro. B

总共有 nn 条带 「圣盾」的「胖头鱼」和 mm 条不带圣盾的胖头鱼,每次等概率对一条存活的胖头鱼造成「剧毒」伤害。 现在 Amazing John 想知道,期望造成多少次伤害可以杀死全部胖头鱼?
答案对 998244353998244353 取模。

  • 「圣盾」:当拥有圣盾的胖头鱼受到伤害时,免疫这条鱼所受到的本次伤害。免疫伤害后,圣盾被破坏。
  • 「胖头鱼」:在一条胖头鱼的圣盾被破坏后,给予其他所有没有死亡且没有圣盾的胖头鱼圣盾。
  • 「剧毒」:立即杀死没有圣盾的胖头鱼。

本题共有 2020 个数据点,数据点从 112020 编号。对于一个子任务,只有通过其中所有数据点才能获得该子任务的分数。

子任务 数据点 数据范围 分数
11 131\sim3 n,m5×103n,m≤5×10^3 1515
22 454\sim5 n106m=0n≤10^6,m=0 1010
33 6106\sim10 n,m106n,m≤10^6 2525
44 111411\sim14 n1014m=0n≤10^{14},m=0 2020
55 152015\sim20 n1014m106n≤10^{14},m≤10^6 3030

为描述方便,使用 0 代表无圣盾的胖头鱼, 1 代表有圣盾的胖头鱼。即,局面可以使用一串 0-1 串表示。

考虑一个局面:有 n 个 0 , m 个 1(000000000000011111111)。 - 如果一次操作作用在 0 上,那么会使其死亡 局面变成有(n - 1)个 0, m 个 1。其概率为 nn+m\frac{n}{n + m}。 - 如果一次操作作用在 1 上,那么会使其死亡 局面变成有 1 个 0, (n + m) 个 1。其概率为 mn+m\frac{m}{n + m}。 设: 一个局面的期望结束操作步数函数为 f(n,m)f(n, m) 。特殊的,设 有 n 个 1 的局面的期望奇数操作步数函数g(n)=f(0,n)\operatorname{g}(n) = \operatorname{f}(0, n)

易知: f(n,m)=1+nn+m×f(n1,m)+mn+m×[ g(n+m)1 ]\operatorname{f}(n, m) = 1 + \frac{n}{n + m}\times\operatorname{f}(n - 1, m) + \frac{m}{n + m}\times[\ \operatorname{g}(n + m) - 1\ ]

g(n)=2+1n×g(n1)+n1n×[ g(n)1 ]\operatorname{g}(n) = 2 + \frac{1}{n}\times\operatorname{g}(n - 1) + \frac{n - 1}{n}\times[\ \operatorname{g}(n) - 1\ ]

化简得

g(n)=n×(n+1)2+n\operatorname{g}(n) = \frac{n \times (n + 1)}{2} + n

最后答案就是 f(n,m)\operatorname{f}(n, m), 递归求解即可。

code

#define int long long
int inv(int x) { x %= MOD; int a = x, b = MOD - 2, ans = 1; while(b) { if(b & 1) ans = (ans *1ll* a) % MOD; a = (a *1ll* a) % MOD; b >>= 1; } return ans; }
int f(int n) { n %= MOD; return ((n) *1ll* (n + 1) % MOD * inv(2) % MOD + n) % MOD; }
int g(int n) { return (f(n) - 1 + MOD )% MOD; }
int doit(int n, int m){
    if(m <= 0) return f(n);
    return (((n % MOD) * inv(n + m) % MOD) * g(n + m) % MOD + (m *1ll* inv(n + m) % MOD) * doit(n, m - 1) % MOD  + 1)% MOD;
}
signed main(){
    int n = read(), m = read();
    printf("%lld\n", doit(n, m));
    return 0;
}

Pro. C

给出一个长度为 nn 的序列(保证Ai[1,2]A_i \in [1, 2]), mm 次操作。 - 询问操作格式为 A s,表示询问是否有一种散步方案使得美丽值之和为 ss。 - 修改操作格式为 C i val,表示将第 ii 朵花的美丽值改成 val(val=1val(val=12)2)

对于每一个询问,若有合法的方案,输出这个方案的左右端点位置(多种方案时输出左端点最小的方案),否则输出 none

Subtask 1 (20pts)\operatorname{Subtask\ 1}\ (20pts):对于数据点 151\sim 5,满足 1n,m10001\leq n,m\leq 1000

Subtask 2 (30pts)\operatorname{Subtask\ 2}\ (30pts):对于数据点 6106\sim 10,满足 1n,m2.5×1051\leq n,m\leq 2.5\times 10^5

Subtask 3 (50pts)\operatorname{Subtask\ 3}\ (50pts):对于数据点 111511\sim 15,满足 1n,m2×1061\leq n,m\leq 2\times 10^6

对于 100%100\% 的数据,有 1n,m2×106,0s23111\leq n,m\leq 2\times 10^6,0\leq s\leq 2^{31}-1。每次修改操作时 i[1,n],val{1,2}i\in[1,n],val\in\{1,2\}

对于所有数据点,时间限制 2000ms2000\operatorname{ms},空间限制 256MB256\operatorname{MB}

留坑!

Pro. D

有一个无限大的棋盘来下马棋。

有一个马最开始在 (0,0)(0,0),它的每一步可以走一个 a×ba\times b 的矩形( 即能够从(x,y)(x,y)到达 (x±a,y±b)(x\pm a,y\pm b)(x±b,y±a)(x\pm b,y\pm a) )。

若马通过上述移动方式可以到达棋盘中任意一个点,那么 p(a,b)=1p(a,b)=1,否则 p(a,b)=0p(a,b)=0

现在 Amazing John 给你 TT 组询问,每组询问他会给出一个正整数 nn,他想知道

(a=1nb=1np(a,b))mod 264\left ( \sum_{a=1}^n\sum_{b=1}^np(a,b) \right )\bmod\ 2^{64}

的值。

本题开启Subtask

子任务 数据点 数据范围 分数
11 11 n10,T5n\leq 10,T\leq5 55
22 252\sim 5 n3000,T5n\leq 3000,T\leq5 1515
33 6106\sim 10 n105,T5n\leq 10^5,T\leq 5 1515
44 111511\sim 15 n107,T5n\leq 10^7,T\leq5 1515
55 161816\sim 18 n109,T5n\leq10^9,T\leq 5 1515
66 192519\sim 25 n×T1011,T5n\times T\leq 10^{11},T\leq 5 3535

注 1:对于 n×T51010n\times T\geq 5*10^{10} 的数据点,时限为 4s ,其余均为 2.5s 。且对于所有数据点,空间限制为 500MB

注 2:输出答案 mod 264\bmod\ 2^{64} 即对 64位无符号整数 自然溢出。

通过打表可知:其中的函数 p\operatorname{p}p(a,b)=[ab] [(ab) mod 2 = 1]\operatorname{p}(a, b) = [a \perp b]\ [(a - b) \ \operatorname{mod} \ 2\ = \ 1]

考虑每个数字的贡献,因为 aa bb 的差为奇数 所以aa bb 的奇偶性不同。 - 对于偶数 xx 贡献为 φ(x)\varphi(x) - 对于奇数 xx 贡献为 φ(x)2\frac{\varphi(x)}{2},即 与 xx 互质的偶数个数。

答案就是: 2×[ i=1n[i mod 2 =1]φ(i)2+i=1n[i mod 2 =0]φ(i) ]2\times[\ \sum_{i=1}^{n}\limits{[i\ \operatorname{mod} \ 2\ = 1]\frac{\varphi(i)}{2}} + \sum_{i=1}^{n}\limits{[i\ \operatorname{mod} \ 2\ = 0]\varphi(i)}\ ]

50pts 不知道怎么杜教筛降复杂度。

code

// 线性筛 phi
#define ULL unsigned long long 
void doit(){
    int n = read();
    ULL ans = 0;
    for(int i = 1; i <= n; i++){
        ans += (i & 1) ? (phi[i] >> 1) : phi[i];
    }
    printf("%llu\n", ans << 1);
}
int main(){ 
    int T = read(); euler(1e7 + 2); while(T--) doit(); return 0; 
}