Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)
题目描述
加里敦星球的人们特别喜欢喝可乐。因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上。这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆。它每一秒都会随机触发一种行为。现 在给加里敦星球城市图,在第0秒时可乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少?
输入输出格式
输入格式:
第一行输入两个正整数况N,M,N表示城市个数,M表示道路个数。(1 <= N <=30,0 < M < 100)
接下来M行输入u,v,表示u,v之间有一条道路。(1<=u,v <= n)保证两座城市之间只有一条路相连。
最后输入入时间t
输出格式:
输出可乐机器人的行为方案数,答案可能很大,请输出对2017取模后的结果。
输入输出样例
说明
【样例解释】
1 ->爆炸
1 -> 1 ->爆炸
1 -> 2 ->爆炸
1 -> 1 -> 1
1 -> 1 -> 2
1 -> 2 -> 1
1 -> 2 -> 2
1 -> 2 -> 3
【数据范围】
对于20%的pn,有1 < t ≤ 1000
对于100%的pn,有1 < t ≤ 10^6。
解题思路:
前置技能:有向图邻接矩阵幂的意义 不懂的戳这里:https://www.cnblogs.com/Dxy0310/p/9838613.html
题目所求的行为方案数可以理解为到每一个可到达的点的方案数的总和,而邻接矩阵的幂正好有这样的性质,
用邻接矩阵$A$表示原图的连通关系,那么$A^k$中的$(i,j)$上的数值表示从$i$到$j$经过$k$的路径方案总数。
那么$\sum\limits_{i=1}^{n} A[1][i]$就是答案的一部分,接下来考虑原地停留的问题,其实原地停留就相当于每个点都有一条自己连自己的边构成自环,将$A_{i,i}$赋值为$1$即可,再考虑自爆的情况,因为自爆之后便没有状态了,所以可以将自爆看成一个新的城市$n+1$,由于可能在每一个点上自爆,所以由每一个点向点$n+1$连一条有向边,由于自爆后没状态,所以点$n+1$的出边应该为$0$。
至此题目就转化成了建立图的邻接矩阵$A$,并计算$A^k$,用矩阵快速幂即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 39
#define maxm
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ll)(ch-'');ch=getchar();}
return x*f;
}
int mp[maxn][maxn],B[maxn][maxn],C[maxn][maxn];
int n,m,k,ans,tot,cnt,t,p; void Martix_mul(int A[maxn][maxn],int B[maxn][maxn])
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
C[i][j]+=A[i][k]*B[k][j],C[i][j]%=p;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
A[i][j]=C[i][j],C[i][j]=;
}
void Quick_mul(int b)
{
while(b)
{
if(b&)
Martix_mul(B,mp);
Martix_mul(mp,mp);
b>>=;
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read(),p=;
for(int i=;i<=m;i++)
{
int x=read(),y=read();
mp[x][y]=mp[y][x]=;
}
for(int i=;i<=n+;i++)
{
mp[i][i]=;
mp[i][n+]=;
B[i][i]=;
}
t=read();
++n;
Quick_mul(t);
for(int i=;i<=n;i++)
ans+=B[][i],ans%=p;
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return ;
}
Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)的更多相关文章
- 求幂大法,矩阵快速幂,快速幂模板题--hdu4549
hdu-4549 求幂大法.矩阵快速幂.快速幂 题目 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 ...
- AcWing 225. 矩阵幂求和 (矩阵快速幂+分治)打卡
题目:https://www.acwing.com/problem/content/227/ 题意:给你n,k,m,然后输入一个n阶矩阵A,让你求 S=A+A^2+A^3.+......+A^k 思 ...
- HDU6395-Sequence 矩阵快速幂+除法分块 矩阵快速幂模板
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 原题目描述在最下面. Solution ...
- HDU2157 How many ways??---(邻接矩阵,图论,矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Others ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
- codeforces 678D Iterated Linear Function 矩阵快速幂
矩阵快速幂的题要多做 由题可得 g[n]=A*g[n-1]+B 所以构造矩阵 { g[n] } = {A B} * { g[n-1]} { 1 } {0 1 ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)
Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...
- 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)
Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...
随机推荐
- Java(16)接口
一.接口:特殊的抽象类 1.1 语法 public interface 接口名 extends 接口1,接口2{ //1.常量 //2.抽象方法 } 1.2 特点 a.用interface修饰 b.接 ...
- L1-Day12
1.凡是杀不死你的都会让你变得更强.(什么关系?主语是什么?)[我的翻译]There is no killing you makes you stronger.[标准答案]What doesn’t k ...
- WebRTC Precompiled 使用
最近研究webrtc native code,但源码太大(10GB以上)又需要FQ,就找了个预编译的版本https://sourcey.com/precompiled-webrtc-libraries ...
- 区别 chown和chmod的用法
本人总是习惯使用chmod,而把chown混淆. chown就是修改 第一列内容的 ,chmod是修改 第3,4列内容的. chown用法用来更改某个目录或文件的用户名和用户组的chown 用户名:组 ...
- python封装configparser模块获取conf.ini值
configparser模块是python自带的从文件中获取固定格式参数的模块,因为是python只带的,大家用的应该很多,我觉得这个参数模块比较灵活,添加参数.修改参数.读取参数等都有对应的参数供用 ...
- MailKit系列之转发电子邮件
原文:http://www.it1352.com/429181.html 问题 我尝试通过MailKit访问一个IMAP账号,我设法下载邮件(作为的MimeMessage),并在某些时候我需要转发给其 ...
- linux的cron
linux系统由cron(crond)这个系统服务来控制的,linux系统上原来有非常多的计划性工作,因此,这个系统服务是默认启动的.cron进程每分钟会定期检查是否有要执行的任务,如果有就自动执行该 ...
- 数据库入门-pymysql模块的使用
一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...
- 屏蔽eslint代码格式报错
1.在文件中找到node_modules 2.node_modules文件夹下的eslint-config-standard 3.打开eslint-config-standard文件夹下的eslint ...
- P2419 [USACO08JAN]牛大赛Cow Contest(dfs走天下/)
题目描述 FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就 ...