【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 * ...
随机推荐
- curl的http上传文件代码
int http_post_file(const char *url, const char *user, const char *pwd, const char *filename){ ass ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...
- Vue 根组件,局部,全局组件 | 组件间通信,案例组件化
一 组件 <div id="app"> <h1>{{ msg }}</h1> </div> <script src=" ...
- maven项目板块的pom.xml配置
项目名为helloweb 项目文件结构图1 helloweb>pom.xml内容如下: <project xmlns="http://maven.apache.org/POM/4 ...
- SQL Server统计数据库中表个数、视图个数、存储过程个数
表个数 SELECT count(*) FROM sys.objects WHERE type='U' 视图个数 SELECT count(*) FROM sys.objects WHERE type ...
- T-SQL LIKE子句 模糊查询
MS SQL Server LIKE子句用于使用通配符运算符将值与类似值进行比较. 有两个通配符与LIKE运算符结合使用: 百分号(%) 下划线(_) 百分号表示零个,一个或多个字符. 下划线表示单个 ...
- C/C++中如何在main()函数之前执行一条语句?
在C语言中,如果使用GCC的话,可以通过attribute关键字声明constructor和destructor(C语言中如何在main函数开始前执行函数) #include <stdio.h& ...
- 查看当前APP打开的是哪个Activity
按下 “window键+R键” 打开电脑的 “运行” 窗口,输入“cmd”,进入你的adb.exe所在的目录,输入 “ adb shell "dumpsys window | grep mC ...
- scp命令:远程复制粘贴文件
文章链接:https://www.cnblogs.com/webnote/p/5877920.html scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有 ...
- Python-视图 触发器 事务 存储过程
1.视图2.触发器*** 在某个时间发生了某个事件时 会自动触发一段sql语句3.事务*****4.存储过程***** 5.函数6.备份与恢复*** mysqldump -u -p (库名 [表名] ...