题目传送门

很容易列出期望的方程,高斯消元搞一波
但是常规消元复杂度是$O(r^6)$的
考虑从左到右从上到下编号
然后按编号从小到大消元

假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系数不为0
同时,该点的方程中也只有绿点的那些项的系数不为0
由于绿点的个数是$O(r)$的,那么每次消元的复杂度就是$O(r^2)$的
总体消元复杂度就是$O(r^4)$的
然后现在得到了上三角矩阵
由于只需要求$(0,0)$点的值
所以只需要把那一行的其它元消掉
这个的复杂度也是$O(r^4)$的
总体复杂度是$O(r^4)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int mod = 1e9 + 7;
const int maxn = 8005;
int add(int x, int y) {
x += y;
大专栏  Circles of Waiting"line"> if(x >= mod) x -= mod;
return x;
}
int mul(int x, int y) {
LL z = 1LL * x * y;
return z - z / mod * mod;
}
int powt(int a, int b) {
int r = 1;
while(b) {
if(b & 1) r = mul(r, a);
a = mul(a, a);
b >>= 1;
}
return r;
}
int f[maxn][maxn];
int id[111][111], a[4], dx[4] = { -1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};
vector<int> c;
int main() {
#ifdef CX_TEST
freopen("E:\program--GG\test_in.txt", "r", stdin);
#endif
int n = 0, r, i, j, k, x, y, u, v;
scanf("%d", &r);
for(i = j = 0; i < 4; i++) {
scanf("%d", &a[i]);
j += a[i];
}
j = powt(j, mod - 2);
for(i = 0; i < 4; i++) a[i] = mod - mul(a[i], j);
for(i = -r; i <= r; i++) {
for(j = -r; j <= r; j++) {
if(i * i + j * j <= r * r) id[i + 55][j + 55] = ++n;
}
}
for(i = -r; i <= r; i++) {
for(j = -r; j <= r; j++) {
if(u = id[i + 55][j + 55]) {
f[u][0] = f[u][u] = 1;
for(k = 0; k < 4; k++) {
x = i + dx[k];
y = j + dy[k];
if(v = id[x + 55][y + 55]) f[u][v] = a[k];
}
}
}
}
for(i = 1;i <= n; i++) {
u = min(n, i + r * 2 + 1);
c.clear();
c.push_back(0);
for(j = i;j <= u; j++) {
if(f[i][j]) c.push_back(j);
}
for(j = i + 1;j <= u; j++) {
if(f[j][i]) {
v = mul(mod - f[j][i], powt(f[i][i], mod - 2));
for(auto e:c) f[j][e] = add(f[j][e], mul(f[i][e], v));
}
}
}
u = id[55][55];
for(i = 1;i <= n; i++) {
if(i == u) continue;
if(f[u][i]) {
v = mul(mod - f[u][i], powt(f[i][i], mod - 2));
for(j = 0;j <= n; j++) f[u][j] = add(f[u][j], mul(f[i][j], v));
}
}
v = powt(f[u][u], mod - 2);
printf("%dn", mul(f[u][0], v));
return 0;
}

Circles of Waiting的更多相关文章

  1. CF963E Circles of Waiting

    Circles of Waiting 求一个整点四连通随机游⾛,离原点距离超过R期望步数.R≤50. 带状矩阵法 本质上就是网格图的随机游走. \[ E_x=\sum_y P_{x,y}E_y+1 \ ...

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

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

  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. 关于汽车诊断OBD的理解(ISO15031-5)(转发)

    1.OBD用来做什么 2.OBD和UDS的区别 3.OBD硬件接口简介 4.OBD的9大模式介绍 OBD(On-Board Diagnostic)指的是在线诊断系统,是汽车上的一种用于监控车辆状况以及 ...

  2. 19)PHP,数组知识

    (1)数组的基础 在PHP中,数组的下标可以是数字,也可以是字符串 在PHP中,数组元素的顺序不是由下标决定的,而是由其加入的的顺序决定 (2)数组定义: array(1,5,11,'abs',tru ...

  3. 关于ping命令的批处理问题

    需求描述:假设你的IP保存在名字为IP.txt的文本文档里,且每行一条ip.你想ping这些IP并得到结果 解决方案:用下面的批处理代码即可实现,将下面的代码保存为后缀为.bat的文件,比如test. ...

  4. 深入理解Java接口

    一.接口的特点 接口中可以有变量和方法,接口中的变量会隐式的指定为public static final变量(并且只能是public static final变量),而方法会被隐式的指定为public ...

  5. iOS头条新闻App、自动布局、省市区联动、登录按钮动画、Alert弹框效果等源码

    iOS精选源码 LEEAlert -- 优雅的Alert ActionSheet 登录按钮 省市区三级联动 JHViewCorner - 一行代码搞定圆角 JHFrameLayout - 一行代码实现 ...

  6. D. Fish eating fruit

    题:https://nanti.jisuanke.com/t/41403 题意:求任意俩点之间距离之和模3后的三个结果的总数(原距离之和) 第一种做法: 树形dp #include<bits/s ...

  7. 2018-1 WebStorm最新版本破解激活方法

    在激活页面选择License Server,输入:http://idea.codebeta.cn,点击Activate即可激活. 如果失效用这个:  http://idea.ibdyr.com

  8. jquery时间控件

    jQuery 时间控件推荐 博客分类: jQuery 时间控件   My97DatePicker  My97DatePicker是一个更全面,更人性化,并且速度一流的日期选择控件.具有强大的日期范围限 ...

  9. linux 上安装 keepalive

    1.keepalive 单机安装 1.1 安装环境 yum -y install kernel-devel* openssl-* popt-devel lrzsz openssh-clients li ...

  10. IPC之——信号量集

    信号量集用于对存在竞争的资源加锁 1.semId=semget(key,nsems,semflg) key:为信号量集名称,可以指定为0455等数字,也可以为PC_PRIVATE nsems:创建几个 ...