题解:

不错的题目

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

比较容易想到矩阵乘法

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

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

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

处理的方法就是 当行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. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  2. vc++基础班[21]---文件的基本操作之CFile

    ①.文件的创建.打开.关闭: 文件的创建.打开:CFile::Open 文件的关闭:CFile::Close   CFile::modeCreate:以新建方式打开,如果文件不存在,则新建:如果文件已 ...

  3. 效率较高的php下读取文本文件的代码

    主要用下面这两个方法fread和 fgets的区别大家需要注意下     fread :以字节位计算长度,按照指定的长度和次数读取数据,遇到结尾或完成指定长度读取后停止.  fgets :整行读取,遇 ...

  4. Codeforces Educational Round 37

    Solved   CodeForces 920A Water The Garden   Solved   CodeForces 920B Tea Queue   Solved   CodeForces ...

  5. 在VS解决方案资源管理器中自动定位当前编辑中的文件

    依次点击 [工具]- [选项] - [项目和解决方案]-[常规]- 勾选[在解决方案资源管理器中跟踪活动项]

  6. linux服务器上配置多个svn仓库

    linux服务器上配置多个svn仓库 1.在指定目录建立仓库保存总目录,本文示例目录设定为:/usr/local/svn/svnrepos # mkdir -p /usr/local/svn/svnr ...

  7. Django 笔记(六)mysql增删改查

    注:增删改查表数据在 views.py 内 添加表数据: 删表数据:  改表数据:  查表数据: 常用的查询方法: 常用的查询条件: 相当于SQL语句中的where语句后面的条件 语法:字段名__规则

  8. Python-面向对象(组合、封装与多态)

    一.组合 什么是组合? 就是一个类的属性 的类型 是另一个自定义类的 类型,也可以说是某一个对象拥有一个属性,该属性的值是另一个类的对象. 通过为某一个对象添加属性(这里的属性是另一个类的对象)的方式 ...

  9. Sybase·调用存储过程并返回结果

    最近项目要用Sybase数据库实现分页,第一次使用Sybase数据库,也是第一次使用他的存储过程.2个多小时才调用成功,在此记录: 项目架构:SSM 1.Sybase本身不支持分页操作,需要写存储过程 ...

  10. ios 本地存储文件夹的使用注意

    文件夹 tmp 属于临时文件夹,不需要自己删除,系统会在应用退出后清空   文件夹 Library 下面的子文件 Caches 也是用来存储的,,但是Library 基本上不会被清除,但是在内存不足的 ...