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. cmd退出python

    cmd中如何退出Python (1)在命令行上输入exit() (2)在命令行上输入quit() (3)ctrl+Z 然后回车

  2. 423 Locked

    TortoiseSVN提交提示423 Locked的解决办法 . 此办法是阅读官方文档(TortoiseSVN-1.6.16-zh_CN.pdf) 4.21 锁部分提供的办法: 首先选择选择要提交的文 ...

  3. Redis缓存在django中的配置

    django  settings中的配置 # 缓存 CACHES = { "default": { "BACKEND": "django_redis. ...

  4. MyBatis框架之异常处理

    MyBatis框架定义了许多的异常类,之所以定义这么多的异常类,应该是将每一种异常情况都独立出来,这样在出现异常时,定位就很明确了.而我们平时写代码时,都是瞎搞一通,异常类大多也是随便定义,或者是使用 ...

  5. Activation functions on the Keras

    sigmoid tanh tanh函数定义如下: 激活函数形状: ReLU 大家族 ReLU softmax 函数 softmax是一个函数,其主要用于输出节点的分类,它有一个特点,所以的值相加会等于 ...

  6. 谷歌SEO和百度SEO的区别

    远程桌面连接 一直有一个现象:关于谷歌优化或只是以谷歌为例谈SEO观点或技术时,经常有读者说,不适用于百度,希望多看到关于百度​​SEO的帖子上一篇利用规范的标签在谷歌排名中陷害竞争对手的帖子,就有好 ...

  7. 修改element中v-loading的自定义图片

    /*elementui loading css 覆盖 开始*/ .el-loading-spinner .circular{ width: 42px; height: 42px; animation: ...

  8. 【前端技术】一篇文章搞掂:微信小程序

    实战: 1.[openId]获取openId 有如下几种方法: 通过wx.login()获取临时登录凭证 code,然后通过code2session获取openId wx.login():https: ...

  9. 8051 r0-r7 是什么

    R0~R7表示当前选中的寄存器组的寄存器0~7,5I机有p0,p1,p2,p3口,每组有八个寄存器(R0-R7),比如MOV A Rn (n=0~7),表示把寄存器Rn 的内容送给累加器A,其中源操作 ...

  10. ArcMap如何撤销配准

    ArcMap地理配准时,更新地理配准后,就没法撤销了. 如何解决呢,更新地理配准后,会在源文件夹中自动生成配准文件(文件格式为.over  .jgwx  .xml),可以通过删除这些文件来清除配准.