题目传送门

很容易列出期望的方程,高斯消元搞一波
但是常规消元复杂度是$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. C和C++的区别,有你不知道的

    c和c++可以说现在都是比较流行的,但是两者到底有什么联系和区别吗,这是学习c和c++最需要注意的,不要把两者搞混了,我们先开始就来看一下c和c++有什么联系,这两者可以这样说:C++是C的超集,兼容 ...

  2. 【转】Linux虚拟终端命令Screen用法详解

    转自 http://www.linuxidc.com/Linux/2013-07/87415.htm 在使用ssh或者telnet登录远程主机后,执行一些耗时的命令,如果此时ssh或者telnet中断 ...

  3. Golang结构体值的交换

    Golang结构体值的交换 一.添加结构体,多if暴力 最先遇到这个问题是在比编写PUT方法的接口时遇到. (我公司编写http put方法,是先解析json至StudentInput结构体中,通过i ...

  4. js几个常用的弹层

    js弹层技术很常见,自己每次用上网找,一找一大堆. 对比了几种,考虑通用性和易用性,这里记录两个. jQueryUI的http://jqueryui.com/dialog/#modal-form ar ...

  5. rsync备份(一)

    1.Rsync基本概述 )概念 rsync:remote sync )开源 )备份 )https://rsync.samba.org/ samba服务器:文件共享,cifs,common intern ...

  6. LIS 问题 二分查找优化

    按n=5,a-{4,2,3,1,5}为例 dp的值依次是: INF INF INF INF INF 4     INF INF INF INF 2     INF INF INF INF 2      ...

  7. java中==和equals

    /** * @author zhaojiatao * @date 2018/7/19 */ public class equalsLearn { public static void main(Str ...

  8. android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码

    Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...

  9. 作业:for循环,迭代法和穷举法

                                                    for()循环 四要素:初始条件,循环条件,状态改变,循环体. 执行过程:初始条件--循环条件--循环体 ...

  10. 机器学习算法之——KNN、Kmeans

    一.Kmeans算法 kmeans算法又名k均值算法.其算法思想大致为:先从样本集中随机选取 kk 个样本作为簇中心,并计算所有样本与这 kk 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最 ...