首页 > 其他分享 >[ABC277G] Random Walk to Millionaire 题解

[ABC277G] Random Walk to Millionaire 题解

时间:2023-11-29 11:23:45浏览次数:40  
标签:ch int 题解 Random long read res ABC277G inc

题目链接

点击打开链接

题目解法

首先 \(O(n^3)\) 的 \(dp\) 是显然的,令 \(f_{i,j,k}\) 为第 \(i\) 步在 \(j\),当前等级为 \(k\) 的 \([i,n]\) 步获得钱数的期望,转移枚举出边即可

一个很妙的优化是:贡献都是 \(k^2\) 的形式,所以我们考虑维护 \(k\) 的 \(0,1,2\) 次幂,即 \(\sum,\sum k,\sum k^2\),这样可以巧妙的去掉 \(k\) 的一维
时间复杂度 \(O(n^3)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=3100,P=998244353;
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
int n,m,k,a[N],gl[N],f[N][N][3];
vector<int> G[N];
int qmi(int a,int b){
    int res=1;
    for(;b;b>>=1){
        if(b&1) res=1ll*res*a%P;
        a=1ll*a*a%P;
    }
    return res;
}
int main(){
    n=read(),m=read(),k=read();
    F(i,1,m){
        int x=read(),y=read();
        G[x].pb(y),G[y].pb(x);
    }
    F(i,1,n) a[i]=read();
    F(i,1,n) gl[i]=qmi(G[i].size(),P-2);
    DF(i,k,1) F(u,1,n){
        for(int v:G[u]){
            if(!a[v]){
                inc(f[i][u][0],f[i+1][v][0]);
                inc(f[i][u][1],(f[i+1][v][1]+f[i+1][v][0])%P);
                inc(f[i][u][2],(f[i+1][v][2]+2ll*f[i+1][v][1]+f[i+1][v][0])%P);
            }
            else{
                inc(f[i][u][0],f[i+1][v][0]+1);
                inc(f[i][u][1],f[i+1][v][1]),inc(f[i][u][2],f[i+1][v][2]);
            }
        }
        F(k,0,2) f[i][u][k]=1ll*f[i][u][k]*gl[u]%P;
    }
    printf("%d\n",f[1][1][2]);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:ch,int,题解,Random,long,read,res,ABC277G,inc
From: https://www.cnblogs.com/Farmer-djx/p/17864184.html

相关文章

  • CF1900D - Small GCD 题解
    1900D-SmallGCD给定序列\(A\),定义\(f(a,b,c)\)为\(a,b,c\)中最小的次小的数的\(\gcd\),求:\[\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^nf(a_i,a_j,a_k)\]题解目前来说有两种方法,都十分有启发意义,但是有共同的开头。考虑到\(A\)的顺序实际上没有......
  • SP19543 GSS8 - Can you answer these queries VIII 题解
    更好的阅读体验SP19543GSS8-CanyouanswerthesequeriesVIIIfhq+二项式定理。提供一个不太一样的思路。默认下标从\(1\)开始。首先插入删除,区间查询,想到可以平衡树维护或者离线下来做线段树。本文中是用的是fhq,好写一些。\(k\)非常的小,考虑对于每一个\(k\)的答......
  • 服务器数据库A的备份恢复到服务器B后出现问题解决
    消息10314,级别16,状态11,第2行尝试加载程序集ID65536时,Microsoft.NETFramework出错。服务器可能资源不足,或者程序集可能不受信任,PERMISSION_SET=EXTERNAL_ACCESS或UNSAFE。如上错误提示,解决办法: alterdatabasedatabasenamesettrustworthyon还有更改数据库......
  • 神经网络入门篇:详解随机初始化(Random+Initialization)
    当训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为0当然也是可以的。但是对于一个神经网络,如果把权重或者参数都初始化为0,那么梯度下降将不会起作用。来看看这是为什么。有两个输入特征,\(n^{[0]}=2\),2个隐藏层单元\(n^{[1]}\)就等于2。因此与一个隐藏层......
  • 【题解】CF1550E Stringforces
    标签:DP\(B^+\)阅读须知:本题解较为详细地讲述的该题解法的思路和来龙去脉,但篇幅较长,请耐心阅读。Step1从题面获取信息我们考虑,因为最大值最小,所以我们首先想到二分答案。然后我们又看到\(k\leq17\)这个限制,所以会想到可能是关于一个\(2^k\)之类的复杂度。以上就是我......
  • ABC330 E Mex and Update 题解
    LinkABC330EMexandUpdateQuestion给一个数组\(a\),有\(Q\)次修改每次把\(a_i\)改成\(x\)问每次修改后,不在\(a\)数组中的最小非负数时多少Solution记录每个\(a_i\)出现的次数\(num\)每个修改操作可以看成时先删除,后添加用set维护为\(num_x=0\)的\(x\)......
  • UVA11275 3D Triangles 题解
    LinkUVA112753DTrianglesQuestion给你三维空间中的两个三角形,请判断它们是否有公共点。Solution如果在三维空间中相交,那么,肯定有一个三角形的某一条边穿过了另外一个三角形Code#include<bits/stdc++.h>usingnamespacestd;constdoubleeps=1e-9;structPoint3{......
  • SP1557 GSS2 - Can you answer these queries II 题解
    SP1557GSS2-CanyouanswerthesequeriesII更好的阅读体验扫描线。把询问挂在右端点上,扫描右端点,纵轴仍为序列维。对于这种出现多次的数只算一次的,记\(pre_i\)表示\(i\)这个值上一次的出现位置,套路化的可以强制让出现多次的在\(pre_i<l\wedgei\)统计,用二维线段树状......
  • CF1900 D Small GCD 题解
    LinkCF1900DSmallGCDQuestion定义\(f(x,y,z)=\gcd(a,b)\),其中\(a,b\)为\(x,y,z\)中较小的那两个数给出数组\(a\),求\[\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n\sum\limits_{k=j+1}^nf(a_i,a_j,a_k)\]三个求和符号本质上就是选数组\(a\)中的三个数,也就是说,数......
  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......