题意:从原点出发,走\(n\)次,每次往四个方向中随机一个走,走每个方向有个概率,求所有方案走到过的点数的方差。

题解:orz kczno1

\(E*all=\sum (a_i-avg)^2*all=\sum a_i^2-2*\sum a_i*avg+avg^2*all*all\)。把\(avg=\frac{\sum a_i}{all}\)代入,可以发现要求的就是\(\sum a_i\)和\(\sum a_i^2\)。以下为了方便求概率。

设\(f_{i,x,y}\)为走了\(i\)步第一次走到\(x,y\)的概率,\(g_{i,x,y}\)为走了\(i\)步最后在\(x,y\)的概率,\(g\)可以暴力DP,\(f\)用\(g\)容斥一下就行了。\(\sum a_i\)显然可以拆成对于每个点,求出经过它的概率并求和,就是\(\sum f\)。

考虑怎样求\(\sum a_i^2\)。可以用类似管道取珠的方法,把\(x^2\)拆成\(\binom{x}{2}*2+x\),那么只要求\(\sum \binom{x}{2}\)。设\(h_{i,x,y}\)为走了\(i\)步第一次走到某个点\(a,b\)并且之前走到过\(a-x,b-y\)的概率和,那么\(h_{i,x,y}=\sum_{j<i,a,b}f_{j,a,b}f_{i-j,x,y}-\sum_{j<i}h_{j,-x,-y}f_{i-j,x,y}\),减掉的是第一次到达某个点\(a,b\)之前到达过\(a+x,b+y\)的概率。

再加一些卡常就uojrk2了。注意用16次一取膜优化的时候要保证每一次加的都为非负数,否则要改为(signed) long long并且改为8次一取膜。一开始因为这个WA飞了。

#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
const int N = 110;
typedef long long ll; int qpow(int a, int b) {
int ret = 1;
while(b) {
if(b & 1) {
ret = 1ll * ret * a % mod;
}
a = 1ll * a * a % mod, b >>= 1;
}
return ret;
} int n, w[4], tt = 0, f[N][N * 2][N * 2], g[N][N * 2][N * 2], h[N][N * 2][N * 2], sf[N], dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0}, s1 = 0, s2 = 0; int main() {
cin >> n;
for(int i = 0; i < 4; i++) {
cin >> w[i], tt += w[i];
}
for(int i = 0; i < 4; i++) {
w[i] = 1ll * w[i] * qpow(tt, mod - 2) % mod;
}
f[0][N][N] = g[0][N][N] = sf[0] = 1;
for(int i = 1; i <= n; i++)
for(int x = -i; x <= i; x++)
for(int y = -i; y <= i; y++) {
if(abs(x) + abs(y) > i) {
continue;
}
ll sum = 0;
for(int k = 0; k < 4; k++) {
sum += 1ll * g[i - 1][x - dx[k] + N][y - dy[k] + N] * w[k];
}
g[i][x + N][y + N] = sum % mod;
sum = g[i][x + N][y + N];
for(int k = 0; k < i; k++) {
sum -= 1ll * f[k][x + N][y + N] * g[i - k][N][N];
if((k & 7) == 7) {
sum %= mod;
}
}
f[i][x + N][y + N] = (sum % mod + mod) % mod;
sf[i] = (sf[i] + f[i][x + N][y + N]) % mod;
sum = 0;
for(int k = 0; k < i; k++) {
sum += 1ll * (sf[k] - h[k][-x + N][-y + N]) * f[i - k][x + N][y + N];
if((k & 7) == 7) {
sum %= mod;
}
}
h[i][x + N][y + N] = (sum % mod + mod) % mod;
}
for(int i = 0; i <= n; i++) {
s1 = (s1 + sf[i]) % mod;
}
for(int i = 0; i <= n; i++)
for(int x = -i; x <= i; x++)
for(int y = -i; y <= i; y++) {
if(abs(x) + abs(y) > i) {
continue;
}
s2 = (s2 + h[i][x + N][y + N]) % mod;
}
tt = qpow(tt, n);
s1 = 1ll * s1 * tt % mod, s2 = 1ll * s2 * tt % mod;
cout << ((1ll * tt * (2ll * s2 + s1) - 1ll * s1 * s1) % mod + mod) % mod;
return 0;
}

[UOJ211][UER #6]逃跑的更多相关文章

  1. 【BZOJ-1340】Escape逃跑问题 最小割

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 264  Solved: 121[Submit] ...

  2. code vs 1026 逃跑的拉尔夫

    1026 逃跑的拉尔夫  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走 ...

  3. AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

    1026 逃跑的拉尔夫  时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold 题解       题目描述 Description   年轻的拉尔夫开玩笑地从一 ...

  4. 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph

    [UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...

  5. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

    要求:  1.要有联动性,老鼠和主人的行为是被动的.  2.考虑可扩展性,猫的叫声可能引起其他联动效应. 我么能事件来一步一步来实现: 将要执行的老鼠逃跑,和主人惊醒的行为注册到事件中,猫叫之后引发事 ...

  6. UOJ #142. 【UER #5】万圣节的南瓜灯 并查集

    #142. [UER #5]万圣节的南瓜灯 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/142 Descrip ...

  7. uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

    #139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...

  8. 逃跑(escape)

    逃跑(escape) 时间限制: 3 Sec  内存限制: 128 MB 题目描述 输入 第一行是5个正整数,n,m,k,S,T,分别代表无向图点数,边数,蝙蝠的数量,二小姐所在起点的编号,目标点的编 ...

  9. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解

    题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...

随机推荐

  1. python2.7+appium第一个脚本(使用夜神模拟器)

    搭建好环境后,可以开始准备脚本的编写工作 目录 1.安装夜神模拟器 2.使用uiautomatorviewer定位 3.运行第一个脚本 1.安装夜神模拟器 第一步:官网下载夜神模拟器,完成安装 双击下 ...

  2. Beetle简单构建TCP服务

    使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...

  3. nodejs 格式化 Date() 为yyyy-MM-dd HH:mm:ss 格式

    ===============2019-11-25更新======== 推荐:更实用完美解决时间格式化的 组件 monent 官网地址:http://momentjs.cn/ ============ ...

  4. 安全运维 - Windows系统应急响应

    挖矿病毒应急 传播方式: 通过社工.钓鱼方式下载和运行了挖矿程序(邮件.IM等) 利用计算机系统远程代码执行漏洞下载.上传和执行挖矿程序. 利用i算计Web或第三方软件漏洞获取计算机权限,然后下载和执 ...

  5. 20190908 On Java8 第十九章 类型信息

    第十九章 类型信息 RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息. Java 主要有两种方式在运行时识别对象和类信息: "传 ...

  6. python+selenium元素定位——8种方法

    定位元素,selenium提供了8中元素定位方法: (1)find_element_by_id() :html规定,id在html中必须是唯一的,有点类似于身份证号 (2)find_element_b ...

  7. [Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  8. ajax 的post方法 的content-type设置和express里应用body-parser

    ajax的post方法相比get方法,在传参形式上很不一样, get把参数用'?'拼接在端口后,并且用'&'连接;而post则是需要在send参数里设置. 根据ajax实例xhr.setReq ...

  9. Dijkstra经典算法注意点

    Dijkstra经典算法注意点 前言 迪杰斯特拉算法,经典模板如下: void dij(int s) { for(int i=1; i<=n; i++) dis[i]=road[s][i]; v ...

  10. 扩展欧几里得算法详解(exgcd)

    一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...