Circles of Waiting

求一个整点四连通随机游⾛,离原点距离超过R期望步数。R≤50。

带状矩阵法

本质上就是网格图的随机游走。

\[E_x=\sum_y P_{x,y}E_y+1
\]

相关联的变量较少,所以使用Band Matrix即可。时间复杂度 \(O(R^4)\)。

https://blog.csdn.net/lycheng1215/article/details/80180178

貌似这题不写主元系数为0时的操作也是对的。

CO int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int p[4];
CO int N=103,O=51;
int idx[N][N],tot;
pair<int,int> pt[N*N];
CO int M=7845+5;
int a[M][M]; int main(){
int R=read<int>();
int all=0;
for(int i=0;i<=3;++i) all+=read(p[i]);
all=fpow(all,mod-2);
for(int i=0;i<=3;++i) p[i]=mul(p[i],all);
for(int y=-R;y<=R;++y)for(int x=-R;x<=R;++x)
if(x*x+y*y<=R*R) idx[x+O][y+O]=++tot,pt[tot]=make_pair(x+O,y+O);
for(int i=1;i<=tot;++i){
a[i][i]=1,a[i][tot+1]=1;
int x=pt[i].first,y=pt[i].second;
for(int j=0;j<=3;++j)if(idx[x+dx[j]][y+dy[j]])
a[i][idx[x+dx[j]][y+dy[j]]]=mod-p[j];
}
int lim=0;
for(int i=1;i<=tot;++i){
lim=max(lim,idx[pt[i].first][pt[i].second+1]);
int inv=fpow(a[i][i],mod-2);
for(int j=i+1;j<=lim;++j)if(a[j][i]){
int coef=mul(mod-a[j][i],inv);
for(int k=i;k<=lim;++k) a[j][k]=add(a[j][k],mul(coef,a[i][k]));
a[j][tot+1]=add(a[j][tot+1],mul(coef,a[i][tot+1]));
}
}
for(int i=tot;i>=1;--i){
for(int j=i+1;j<=tot;++j)
a[i][tot+1]=add(a[i][tot+1],mod-mul(a[i][j],a[j][tot+1])),a[i][j]=0;
a[i][tot+1]=mul(a[i][tot+1],fpow(a[i][i],mod-2)),a[i][i]=1;
}
printf("%d\n",a[idx[O][O]][tot+1]);
return 0;
}

主元法

可以对每一行最左边的元素设置未知变量。

每个点可以向上下左右走,那么如何转移系数呢?

\[E_{x-1,y}=p_1E_{x-2,y}+p_2E_{x-1,y-1}+p_3E_{x,y}+p_4E_{x-1,y+1}+1\\
E_{x,y}=\frac{1}{p_3}(E_{x-1,y}-p_1E_{x-2,y}-p_2E_{x-1,y-1}-p_4E_{x-1,y+1}-1)
\]

所以说系数的转移还可以间接来整。

时间复杂度 \(O(R^3)\)。

CO int N=100+10;
int p[4];
int c[N][N][N];
int a[N][N]; int main(){
int R=read<int>();
int all=0;
for(int i=0;i<=3;++i) all+=read(p[i]);
all=fpow(all,mod-2);
for(int i=0;i<=3;++i) p[i]=mul(p[i],all);
int n=2*R+1;
function<bool(int,int)> check=[R](int x,int y)->bool{
return (x-R-1)*(x-R-1)+(y-R-1)*(y-R-1)<=R*R;
};
for(int x=1;x<=n;++x)for(int y=1;y<=n;++y){
if(!check(x,y)) continue;
if(!check(x-1,y)){
c[x][y][y]=1;
continue;
}
int inv=fpow(p[2],mod-2);
for(int i=1;i<=n+1;++i){
int sum=c[x-1][y][i];
sum=add(sum,mod-mul(p[0],c[x-2][y][i]));
sum=add(sum,mod-mul(p[1],c[x-1][y-1][i]));
sum=add(sum,mod-mul(p[3],c[x-1][y+1][i]));
if(i==n+1) sum=add(sum,mod-1);
c[x][y][i]=mul(sum,inv);
}
}
for(int y=1;y<=n;++y){
int x=sqrt(R*R-(y-R-1)*(y-R-1))+R+1;
for(int i=1;i<=n+1;++i){
int sum=c[x][y][i];
sum=add(sum,mod-mul(p[0],c[x-1][y][i]));
sum=add(sum,mod-mul(p[1],c[x][y-1][i]));
sum=add(sum,mod-mul(p[3],c[x][y+1][i]));
if(i==n+1) sum=add(sum,mod-1);
a[y][i]=sum;
}
a[y][n+1]=mod-a[y][n+1];
}
for(int i=1;i<=n;++i){
int p=i;
for(int j=i;j<=n;++j)
if(a[j][i]) {p=j;break;}
if(p!=i) swap(a[p],a[i]);
int inv=fpow(a[i][i],mod-2);
for(int j=1;j<=n;++j)if(j!=i){
int coef=mul(mod-a[j][i],inv);
for(int k=i;k<=n+1;++k) a[j][k]=add(a[j][k],mul(coef,a[i][k]));
}
}
for(int i=1;i<=n;++i)
a[i][n+1]=mul(a[i][n+1],fpow(a[i][i],mod-2)),a[i][i]=1;
int ans=c[R+1][R+1][n+1];
for(int i=1;i<=n;++i) ans=add(ans,mul(c[R+1][R+1][i],a[i][n+1]));
printf("%d\n",ans);
return 0;
}

CF963E Circles of Waiting的更多相关文章

  1. [CF963E]Circles of Waiting[高斯消元网格图优化+期望]

    题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...

  2. Circles of Waiting

    题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...

  3. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)

    A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...

  4. the user operation is waiting

    eclipse在编辑完代码保存的时候,弹出一个进度框,等N长时间,标题是"user operation is waiting",里面显示的是building workspace的进 ...

  5. Centos:Another app is currently holding the yum lock; waiting for it to exit...

    Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是:PackageKit 内存: 27 ...

  6. Database 'xxxx' is being recovered. Waiting until recovery is finished.

    巡检发现一个SQL SERVER Express 2005数据库备份时出现下面错误: Database 'xxxx' is being recovered. Waiting until recover ...

  7. 关于eclipse保存代码很慢,提示the user operation is waiting的问题

    关于eclipse保存代码很慢,提示the user operation is waiting的问题 首先 去掉 project - build Automaticlly 然后 project-> ...

  8. android模拟器停在Waiting for HOME解决方案

    直接打开Android SDK Manager然后再从Android SDK Manager里的tools打开Android AVD Manager,删除掉在Eclipse里创建的模拟器.并在新建一个 ...

  9. ORA-04021 timeout occurred while waiting to lock object

    用户要求删除一个数据库的用户 GREENPASS,在删除的过程中,报错如下: drop user GREENPASS * ERROR at line 1: ORA-04021: timeout occ ...

随机推荐

  1. GO富集分析 信号通路

    基因富集分析是分析基因表达信息的一种方法,富集是指将基因按照先验知识,也就是基因组注释信息进行分类. 信号通路是指能将细胞外的分子信号经细胞膜传入细胞内发挥效应的一系列酶促反应通路.这些细胞外的分子信 ...

  2. python自动刷新抢火车票

    #!/usr/bin/env python #-*- coding: utf-8 -*- """ 火车票 可以自动填充账号密码,同时,在登录时,也可以修改账号密码 然后手 ...

  3. 大量TIME_WAIT连接的解决办法

    1.使用keep alive连接(待补充) 2.修改tcp参数 根据TCP协议的连接断开规定,发起socket主动关闭的一方,socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个 ...

  4. javascript is ths best computer language

    alert('javascript is one of the best computer languages')

  5. Vue-Router原理

    Hash 与 History 路由原理 实现路由 /** * 1.前端路由与后端路由的区别 后端路由: 输入url => 请求发送到服务器 => 服务器解析请求路径 => 拿到对应页 ...

  6. BUUCTF | MD5

    题目:e00cf25ad42683b3df678c61f42c6bda flag{admin1} 算是一个资源收集吧,Orz,https://www.cmd5.com/

  7. [CSP-S模拟测试]:画作(BFS+数学)

    题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...

  8. 如何保留小数点后N位?

    2014年10月17日09:48:39 在做项目中遇到的,要把想显示的数据进行规定小数位的保留,下面写一下用过的方法: 1. BigDecimal 方法(我做项目的时候用的方法) 代码: java.m ...

  9. Jmeter 5.1 从excel读取数据执行接口自动化

    思路:数据在excel文件中进行维护,然后转换成csv格式,jme中读取数据执行: 1.将接口各数据在excel文件中进行维护,然后存为csv格式,我的数据如下: 2.jmeter脚本,配置csv文件 ...

  10. Bash Shell中命令行选项/参数处理

    0.引言 写程序的时候经常要处理命令行参数,本文描述在Bash下的命令行处理方式. 选项与参数: 如下一个命令行: ./test.sh -f config.conf -v --prefix=/home ...