• GDKOI 2021 提高组 Day2 第一题 游戏(解方程)


    GDKOI 2021 提高组 Day2 第一题 游戏

    题目大意

    • 0 0 0颗星开始到 n n n颗星结束,有 i i i颗星时,会有 x i x_i xi的概率升星, 1 − x i 1-x_i 1xi概率降星, i i i 0 0 0时则保持不变,求到达 n n n颗星的期望步数。
    • n ≤ 1 0 6 nle10^6 n106

    题解

    • 根据期望的线性性,可以分别求出每个从 i i i i + 1 i+1 i+1的期望步数,然后全部相加即为答案。
    • i = 0 i=0 i=0时,可以列出方程:
    • p 0 = x + ( 1 − x ) ( 1 + p 0 ) p_0=x+(1-x)(1+p_0) p0=x+(1x)(1+p0)
    • i > 0 i>0 i>0时,可以列出方程:
    • p i = x + ( 1 − x ) ( 1 + p i − 1 + p i ) p_i=x+(1-x)(1+p_{i-1}+p_i) pi=x+(1x)(1+pi1+pi)
    • 发现该形式可以从 0 0 0开始依次解出来。

    代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define md 998244353
    #define N 1000010
    int read() {
    	int s = 0;
    	char x = getchar();
    	while(x < '0' || x > '9') x = getchar();
    	while(x >= '0' && x <= '9') s = s * 10 + x - 48, x = getchar();
    	return s;
    }
    ll ksm(ll x, ll y) {
    	if(!y) return 1;
    	ll l = ksm(x, y / 2);
    	if(y % 2) return l * l % md * x % md;
    	return l * l % md;
    }
    int main() {
    	int n = read(), i;
    	ll ans = 0, la = 0;
    	for(i = 1; i <= n; i++) {
    		ll x = read(), y = read();
    		x = x * ksm(y, md - 2) % md;
    		la = (la + 1 - x * la % md + md) * ksm(x, md - 2) % md;
    		ans = (ans + la) % md;
    	}
    	printf("%lld
    ", ans);
    	return 0;
    }
    

    自我小结

    • 期望题解方程是比较一般的套路。
    • 但尽管再简单的题也要注意检查,注意模数的大小,并且注意每个地方都要记得取模,负数需改为正。
    哈哈哈哈哈哈哈哈哈哈
  • 相关阅读:
    CSRF 1 (转)
    学习笔记-静态SQL和动态SQL
    学习笔记-oracle-PL/SQL-动态游标
    spring框架介绍以及简单使用
    SpringMvc的常用注解
    tcp的三次握手个四次挥手
    大量面试题
    Comparable和Comparator接口
    JVM介绍
    JVM类加载
  • 原文地址:https://www.cnblogs.com/LZA119/p/14437604.html
Copyright © 2020-2023  润新知