zoukankan      html  css  js  c++  java
  • 洛谷 P6858 深海少女与胖头鱼(期望dp)

    传送门


    解题思路

    我才不是因为题目变蓝题了才做的呢
    看一眼数据范围,普通期望dp(dp[n][m])比较容易想,但是只有卑微的25分。
    发现 (nleq10^{14}),所以我们可以大胆推测做法只与m有关。
    于是我们就从m入手思考这道问题。
    (f(n,m)) 表示杀死n个带护盾的m个不带盾的期望步数,每次讨论攻击到的是带护盾的还是不带护盾的。

    • 当m==0时,(f(n,0)=1+f(n-1,1))
    • 当m==1时,(f(n,1)=1+frac{1}{n+1} imes f(n,0)+frac{n}{n+1} imes f(n,1))
    • 当 m>1 时,(f(n,m)=1+frac{m}{n+m} imes f(n,m-1)+frac{n}{n+m} imes f(n+m-1,1))

    这时候,我们只要能用一个多项式表示出 (f(n,1)),就能把n这一维去掉。
    对于

    [f(n,1)=1+frac{1}{n+1} imes f(n,0)+frac{n}{n+1} imes f(n,1) ]

    移项整理得

    [f(n,1)=f(n,0)+(n+1) ]

    再带入 (f(n,0)),得

    [egin{aligned} f(n,1)& =1+f(n-1,1)+(n+1)\ & =f(n-1,1)+n+2\ end{aligned}]

    然后运用你的可爱的数学知识写出 (f(n,1)) 的函数关系式:

    [f(n,1)=frac{n^2+5n+2}{2} ]

    于是就可以快乐的dp了。
    注意事项:因为要取模,所以可以省去分子分母约分的过程,否则你O(m)的做法也会稳TLE。
    惨痛经历
    image
    //改完了后因为省掉了一个log一跃成为最优解(翻身做主人)
    image

    AC代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const long long mod=998244353;
    long long n,m;
    long long ksm(int x,int y){
    	if(y==1) return x%mod;
    	long long res=ksm(x,y/2);
    	if(y&1) return res*res%mod*x%mod;
    	return res*res%mod;
    }
    inline long long inv(int x){
    	return ksm(x,mod-2);
    }
    struct node{
    	long long p,q;
    	node operator +(const node &x)const{
    		node ans(0,0);
    		ans.q=q*x.q%mod;
    		ans.p=(x.q*p+q*x.p)%mod;
    		return ans;
    	}
    	node operator *(const node &x)const{
    		return node(x.p*p%mod,x.q*q%mod);
    	}
    	node(long long p,long long q):p(p),q(q){}
    }dp(0,0);
    node f(long long n){
    	n%=mod;
    	return node((n*n+5*n+2)%mod,2);
    }
    int main(){
    	cin>>n>>m;
    	if(m==0){
    		dp=node(1,1)+f(n-1);
    		cout<<dp.p*inv(dp.q%mod)%mod;	
    		return 0;	
    	}
    	dp=f(n);
    	for(int i=2;i<=m;i++){
    		dp=node(1,1)+dp*node(i,(n+i)%mod)+node(n%mod,(n+i)%mod)*f(n+i-1);
    	}
    	cout<<dp.p*inv(dp.q%mod)%mod;
        return 0;
    }
    
  • 相关阅读:
    CPU高问题排查
    java lambda特性(持续学习+更新)
    零星小记
    redis分布式锁和lua脚本
    webservice之拦截器
    扫一扫
    qq登录
    banner的使用
    surfaceview+mediaplayer
    viewpager加fragment可滑动加radio跟随滑动
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14883400.html
Copyright © 2011-2022 走看看