题目传送门

很容易列出期望的方程,高斯消元搞一波
但是常规消元复杂度是$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. 14 微服务电商【黑马乐优商城】:day06-了解vue-router和webpack的使用

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  2. mysql批量删除报1064原因

    DELETE FROM table_name  t where t......; 报1064 错误,原因MySQL 中delete 语句不能给表名起别名. 另外.如果记录不存在,delete from ...

  3. << 和>> 的计算公式

    在java中,一个数左移n位,就是将这个数乘以2的n次方,右移就是将这个数除以2的n次方. 如: 8>>2 = 2  (8/2^2) 15 << 3 = 120  (15*(2 ...

  4. 项目课 day02.1

    JWT - json-web-token json.dumps(d,separators = (',' , ':')) separators:分隔符,键值对之间  ,相连, jwt.encode({' ...

  5. 2019-2020-1 20199324《Linux内核原理与分析》第三周作业

    第二章 操作系统是如何工作的 一.知识点总结 1.计算机的三个法宝 存储程序计算机 函数调用堆栈机制.堆栈:是C语言程序运行时必须使用的记录函数调用路径和参数存储的空间. 中断 2.堆栈相关的寄存器和 ...

  6. 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录

    人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...

  7. 源码分析SpringBoot启动

    遇到一个问题,需要从yml文件中读取数据初始化到static的类中.搜索需要实现ApplicationRunner,并在其实现类中把值读出来再set进去.于是乎就想探究一下SpringBoot启动中都 ...

  8. [LC] 520. Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  9. cs231n spring 2017 lecture3 Loss Functions and Optimization

    1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...

  10. [LC] 367. Valid Perfect Square

    Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...