【CF446D】DZY Loves Games
题解:
不错的题目
首先要求的黑点个数非常多
比较容易想到矩阵乘法
于是我们可以求出从某个黑点出发到任意一个黑点之间的概率
发现不同出发点带来的变化只有常数项
于是我们可以预处理出从每个方程转移的系数
处理的方法就是 当行a减去k倍的行b时
我们同时更新行b被多少行更新了
求完之后我们只需要求它的k-2次幂
当然我们还需要求出起点1到每个黑点的概率(一起求)
矩阵乘法的比较优的写法是这样的
rep(i,,n)
rep(j,,n)
if (x.a[j][i])
rep(k,,n)
z.a[j][k]+=x.a[j][i]*y.a[i][k];
要再快可以使用分块乘法
高斯消元的时候由于f[i][i]=1,所以可以不去找最大值
因为那样的话我们处理哪些由哪些转移还要记录pos,比较麻烦
cf还卡栈。。快速幂要写成非递归形式的
代码:
#include <bits/stdc++.h>
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
using namespace std;
const int N=6e5;
const int N2=;
int head[N2],v[N2],du[N2],l,n,m,k,M[N2][N2];
double o2[N2];
double f[N2][N2],jl[N2][N2];
double ee=1.00000000000000000;
struct re{
int a,b;
}a[N*];
void arr(int x,int y)
{
a[++l].a=head[x];
a[l].b=y;
head[x]=l;
}
struct re1{
double a[][];
re1()
{
rep(i,,n)
rep(j,,n) a[i][j]=;
}
}o;
re1 z;
re1 js(re1 x,re1 y)
{
memset(z.a,,sizeof(z.a));
rep(i,,n)
rep(j,,n)
if (x.a[i][j])
rep(k,,n)
z.a[i][k]+=x.a[i][j]*y.a[j][k];
return(z);
}
re1 y;
re1 o3;
re1 fsp(rint x)
{
memset(y.a,,sizeof(y.a));
o3=o;
rep(i,,n) y.a[i][i]=;
while (x)
{
if (x&) y=js(y,o3);
x>>=;
o3=js(o3,o3);
}
return(y);
}
int ve[N2],cnt=;
void Gauss()
{
rep(i,,n) jl[i][i]=;
rep(i,,n)
{
rep(j,,n)
if (i!=j)
{
double t=-f[j][i]/f[i][i];
rep(k,,n) f[j][k]+=t*f[i][k];
rep(k,,n) jl[j][k]+=t*jl[i][k];
}
}
rep(i,,n)
if (v[i])
{
cnt=;
double tmp=ee/du[i];
rep(j,,n)
if (M[i][j]) ve[++cnt]=j;
rep(k,,n)
if (v[k])
{
double ans=;
rep(j,,cnt) ans+=M[i][ve[j]]*jl[k][ve[j]]*tmp;
o.a[i][k]=ans;
}
}
rep(j,,n)
if (v[j])
o2[j]=jl[j][];
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m>>k;
rep(i,,n)
{
cin>>v[i];
}
rep(i,,m)
{
int x,y;
cin>>x>>y;
arr(x,y); arr(y,x);
M[x][y]++; M[y][x]++;
du[x]++; du[y]++;
}
rep(i,,n)
{
f[i][i]=-;
for (int u=head[i];u;u=a[u].a)
{
int vv=a[u].b;
if (!v[vv]) f[i][vv]+=ee/du[vv];
}
}
Gauss();
double ans=;
if (k!=)
{
re1 ans2=fsp(k-);
rep(i,,n)
if (v[i]) ans+=o2[i]*ans2.a[i][n];
} else
if (k==) ans=o2[n];
else ans=;
printf("%.9f",ans);
return ;
}
【CF446D】DZY Loves Games的更多相关文章
- 【CF446D】DZY Loves Games 高斯消元+矩阵乘法
[CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...
- 【BZOJ3561】DZY Loves Math VI (数论)
[BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...
- 【BZOJ3309】DZY Loves Math(莫比乌斯反演)
[BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...
- 【BZOJ3512】DZY Loves Math IV(杜教筛)
[BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...
- 【BZOJ3309】DZY Loves Math 解题报告
[BZOJ3309]DZY Loves Math Description 对于正整数\(n\),定义\(f(n)\)为\(n\)所含质因子的最大幂指数.例如\(f(1960)=f(2^3×5^1×7^ ...
- 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)
[BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...
- 【题解】DZY Loves Chinese
[题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...
- 【BZOJ3569】DZY Loves Chinese II
[BZOJ3569]DZY Loves Chinese II 题面 bzoj 题目大意: 给你一张\(N(1\leq N\leq 10^5)\)个点\(M(1\leq M\leq 5\times 10 ...
- 【BZOJ3309】DZY Loves Math
Time Limit: 5000 ms Memory Limit: 512 MB Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * ...
随机推荐
- 在PHP中使用AES加密算法加密数据及解密数据
这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原. 除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解. 在PHP中,我们必须先安装好mcr ...
- Log4PHP日志库使用
库下载地址: http://logging.apache.org/log4php/download.html 当前测试使用的版本为2.3.0 1.解压缩下载的压缩文件apache-log4php-2. ...
- 关于flock
昨天在研究dropbear实现时,看到初始化脚本/etc/init.d/dropbear中有关于文件锁lock的内容,如下: lock /tmp/.switch2jffs mkdir -p /e ...
- 使用lld自动发现监控多实例redis
zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统.服务.业务)层面.可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦.例 ...
- 本地项目提交到github和提交更新(转)
一:首先当然是去github注册账号了. 二:注册完毕登录后,在自己的首页上面点击右上角“+”号,然后选择New repository,或者直接点击下面的绿色按钮,创建一个新仓库.如图: 然后填入仓库 ...
- bash的快捷键、特殊参数、历史命令、相关文件
bash快捷键 Emacs风格 ctrl+p: 方向键 上 ↑ ctrl+n: 方向键下 ↓ ctrl+b: 方向键 ← alt+f: 光标右移一个单词 ctrl+f :方向键 → alt+b: 光标 ...
- 前端 --- 关于DOM的介绍
111 什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解 ...
- 【原创】Linux基础之opensuse15
装机 装机之后执行 sudo zypper ar -fc https://mirrors.aliyun.com/opensuse/distribution/leap/15.0/repo/oss ope ...
- Js操作Array数组
之前写过一篇文章,但是很模糊,不过却给我提供了一个思路,所以没有删除,这次写的是一个完善版本! 因为在很多的时候我们在选中了几行数据,然后存放在Array中,如下图: 看下控制台的数据 我双击了这两个 ...
- Jenkins五 配置tomcat
一:jdk安装 查看系统自带jdk版本并卸载 [root@localhost conf]# rpm -qa|grep jdkjdk1.8-1.8.0_201-fcs.x86_64 移除: yum re ...