题解:

不错的题目

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

比较容易想到矩阵乘法

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

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

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

处理的方法就是 当行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. 数据库的OLE字段写入长二进制文件

    //'*************************************************************************************** //'函数:将数据 ...

  2. 缓存系列之一:buffer、cache与浏览器缓存

    缓存系列之一:buffer.cache与浏览器缓存 一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保 ...

  3. codecs and formats of digital media

    A codec is a device or software that is used to compress or decompress a digital media file, such as ...

  4. JQery插件clipboard.js ----将文本复制到剪贴板的现代化方法

    ### 之前用了js自带的剪贴板对象clipboardData 对象以为就可以实现粘贴复制,但是种只支持IE的. 就找了jq的一个插件Zclip,但是网上的说法是利用了flesh来实现的,我用了之后可 ...

  5. CURL错误代码及含义

    https://curl.haxx.se/libcurl/c/libcurl-errors.html NAME libcurl-errors - error codes in libcurl DESC ...

  6. Go语言环境安装&搭建(Win)

    Go语言简介 什么是Go语言 Go语言是谷歌2009发布的第二款开源编程语言. Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持 ...

  7. kindeditor用法简单介绍(转)

    1,首先去官网下载http://www.kindsoft.net/ 2,解压之后如图所示: 由于本人做的是用的是JSP,所以ASP,PHP什么的就用不上了,直接把那些去掉然后将整个文件夹扔进Myecl ...

  8. 做了5年的Android,我转Java后台了!

    很多人做Java开发4,5年后,都会感觉自己遇到瓶颈.什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理.公司的工作节奏又比较快,难有机会学习架 ...

  9. Modbus库开发笔记:Modbus ASCII Slave开发

    与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave.对于Modbus ASCII从站来说,需要实现 ...

  10. iOS 运行时使用(交换两个方法)

    举例 在创建了如下代码 NSString *str=nil; NSURL *url =[NSURL URLWithString:str]; NSLog(@"%@",url); 但是 ...