题解:

不错的题目

首先要求的黑点个数非常多

比较容易想到矩阵乘法

于是我们可以求出从某个黑点出发到任意一个黑点之间的概率

发现不同出发点带来的变化只有常数项

于是我们可以预处理出从每个方程转移的系数

处理的方法就是 当行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的更多相关文章

  1. 【CF446D】DZY Loves Games 高斯消元+矩阵乘法

    [CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...

  2. 【BZOJ3561】DZY Loves Math VI (数论)

    [BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...

  3. 【BZOJ3309】DZY Loves Math(莫比乌斯反演)

    [BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...

  4. 【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 ...

  5. 【BZOJ3309】DZY Loves Math 解题报告

    [BZOJ3309]DZY Loves Math Description 对于正整数\(n\),定义\(f(n)\)为\(n\)所含质因子的最大幂指数.例如\(f(1960)=f(2^3×5^1×7^ ...

  6. 【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 ...

  7. 【题解】DZY Loves Chinese

    [题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...

  8. 【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 ...

  9. 【BZOJ3309】DZY Loves Math

    Time Limit: 5000 ms Memory Limit: 512 MB Description ​ 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * ...

随机推荐

  1. VC中的字符串转换宏

              ATL7.0引入了几个新的转换类和宏,现有的宏提供了显着的改善.新的字符串转换类和宏的名称,采取的形式如下: C SourceType [C]DestinationType[EX] ...

  2. Mudo C++网络库第二章学习笔记

    线程同步的精要 并发有两种基本的模型: 一种是message passing(消息传递); 另一种是shared memory(共享内存); 在分布式系统中(有多台物理机需要通信), 运行在多台机器上 ...

  3. 数字证书及CA的扫盲介绍

    ★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥.晦涩.俺先拿一个通俗的例子来说事儿. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 ...

  4. 持续集成①安装部署jenkins从git获取代码

    持续集成①安装部署jenkins从git获取代码 一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部 ...

  5. javacv:调取本地摄像头,抓取人脸,保存为图片

    MAVEN: <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platf ...

  6. linux shell中 if else以及大于、小于、等于逻辑表达式

    在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下,方便需要的朋友 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示 ...

  7. 【原创】运维基础之Ansible(2)离线安装

    1 在一个能访问远程repo的服务器上执行,下载ansible及相关依赖的rpm包 # mkdir ansible# yum install --downloadonly --downloaddir= ...

  8. JS调用摄像头并上传图片到服务器

    本功能只能把图片转成base64码上传,如何上传图片还没有修改出来,有兴趣的朋友弄出来了,请给我留下言,谢谢了! 直接上代码,需要的朋友直接复制就可以使用了. <!DOCTYPE html> ...

  9. 练就Java24章真经—你所不知道的工厂方法

    前言 最近一直在Java方向奋斗<终于,我还是下决心学Java后台了>,今天抽空开始学习Java的设计模式了.计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式 ...

  10. PID控制器开发笔记之十一:专家PID控制器的实现

    前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...