CF963E Circles of Waiting
Circles of Waiting
求一个整点四连通随机游⾛,离原点距离超过R期望步数。R≤50。
带状矩阵法
本质上就是网格图的随机游走。
\]
相关联的变量较少,所以使用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,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的更多相关文章
- [CF963E]Circles of Waiting[高斯消元网格图优化+期望]
题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...
- Circles of Waiting
题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...
- Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)
A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...
- the user operation is waiting
eclipse在编辑完代码保存的时候,弹出一个进度框,等N长时间,标题是"user operation is waiting",里面显示的是building workspace的进 ...
- 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 ...
- Database 'xxxx' is being recovered. Waiting until recovery is finished.
巡检发现一个SQL SERVER Express 2005数据库备份时出现下面错误: Database 'xxxx' is being recovered. Waiting until recover ...
- 关于eclipse保存代码很慢,提示the user operation is waiting的问题
关于eclipse保存代码很慢,提示the user operation is waiting的问题 首先 去掉 project - build Automaticlly 然后 project-> ...
- android模拟器停在Waiting for HOME解决方案
直接打开Android SDK Manager然后再从Android SDK Manager里的tools打开Android AVD Manager,删除掉在Eclipse里创建的模拟器.并在新建一个 ...
- ORA-04021 timeout occurred while waiting to lock object
用户要求删除一个数据库的用户 GREENPASS,在删除的过程中,报错如下: drop user GREENPASS * ERROR at line 1: ORA-04021: timeout occ ...
随机推荐
- JVM、JRE、JDK的区别
什么是Java虚拟机(JVM)?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- Java double转long方法
Java double转long方法 double random = Math.round(Math.random()*10000); long l = new Double(random).long ...
- JavaWeb(一):Java技术概览
一.Java技术体系 在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言. 从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分: ...
- kylin相关问题
1.Kylin踩坑笔记 - 启动Kylin出现Could not find or load main class org.apache.hadoop.hbase.util.GetJavaPropert ...
- springmvc的@ModelAttribute
1:作用:执行任何方法前都要先执行一下有这个标识的方法. 用途:表单回显的时候先从数据库中查询出来放到这个方法中. 1):模拟表单 <form action="first/testMo ...
- 远程桌面按键失效变成快捷键(远程桌面连接时会自动按下win键)
三个电脑快捷键 (无意中学会三个快捷键了.....)win + L 锁屏win + D 切换到桌面win + F 搜索 在使用远程桌面连接Windows 2008操作系统,发现一个很烦的问题,经常发现 ...
- window 2008/2012计划任务配置
很多人在问我: 1.Windows Server 2008 计划任务在哪里配置? 2.Windows Server 2008 可以配置每分钟或是每小时执行我的任务吗? 答案是:可以! 首先Window ...
- Ubuntu配置jdk环境变量
下载jdk,解压到你想要的目录 在/etc/profile里最后添加 export JAVA_HOME=/home/zzs0/Programs/jdk1.8.0_102export JRE_HOME= ...
- three dots in git
What are the differences between double-dot “..” and triple-dot “…” in Git commit ranges? Using Comm ...
- configure error C compiler cannot create executables错误解决
我们在编译软件的时候,是不是经常遇到下面的错误信息呢? checking build system type... i686-pc-linux-gnuchecking host system ty ...