Portal

Description

给出一张\(n(n\leq30)\)个点\(m(m\leq100)\)条边的无向图。初始时有一个可乐机器人在点\(1\),这个机器人每秒会做出以下三种行为之一:原地不动,走向相邻点,自爆(自爆后就不能动了)。求经过\(t(t\leq10^6)\)秒后可乐机器人的行动方案数。

Solution

矩阵乘法优化DP。

首先改一下原图:每个点向自己连一条自环;建立一个点\(n+1\)表示自爆,其余每个点向\(n+1\)连一条有向边。然后原问题就简化成了在一个有向图上,每秒走向一个相邻的点。

\(dp[i][x]\)表示机器人在第\(i\)秒时在点\(x\)有多少种方案。做出邻接矩阵\(M\),则转移方程为:

\[ dp[i+1][v]=\sum_{u=1}^n \sum_{v=1}^n dp[i][u]M_{uv} $$ 是不是和矩阵乘法有点像?将$dp[i]$看做一个向量,则有$dp[i]=dp[i-1]\times M$。我们要求的是$dp[t]=dp[1]\times M^t$,那么只要做矩阵快速幂就好啦。
> 时间复杂度$O(n^3logt)$。

##Code
```cpp
//[TJOI2017]可乐
#include <cstdio>
#include <cstring>
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
const int P=2017;
const int N=40;
int n,m;
struct mtx
{
int row,col; int x[N][N];
mtx(int _row=0,int _col=0) {row=_row,col=_col; memset(x,0,sizeof x);}
friend mtx operator *(mtx A,mtx B)
{
mtx C=mtx(A.row,B.col);
for(int i=1;i<=A.row;i++)
for(int k=1;k<=A.col;k++)
for(int j=1;j<=B.col;j++)
C.x[i][j]=(C.x[i][j]+A.x[i][k]*B.x[k][j])%P;
return C;
}
};
mtx pow(mtx A,int k)
{
mtx r=mtx(A.row,A.col),t=A;
for(int i=1;i<=A.row;i++) r.x[i][i]=1;
for(int i=k;i;i>>=1,t=t*t) if(i&1) r=r*t;
return r;
}
int main()
{
n=read(),m=read(); mtx tr=mtx(n+1,n+1);
for(int i=1;i<=n+1;i++) tr.x[i][i]=1,tr.x[i][n+1]=1;
for(int i=1;i<=m;i++)
{
int u=read(),v=read();
tr.x[u][v]=tr.x[v][u]=1;
}
int t=read(); mtx r=mtx(1,n+1);
r.x[1][1]=1; r=r*pow(tr,t);
int ans=0;
for(int i=1;i<=n+1;i++) ans=(ans+r.x[1][i])%P;
printf("%d\n",ans);
return 0;
}
```\]

洛谷P3758 - [TJOI2017]可乐的更多相关文章

  1. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 299  Solved: 207 Description 加里敦星球的人 ...

  2. [洛谷P3763] [TJOI2017]DNA

    洛谷题目链接:[TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其 ...

  3. [洛谷P3761] [TJOI2017]城市

    洛谷题目链接:[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速 ...

  4. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  5. 洛谷P3763 [Tjoi2017]DNA 【后缀数组】

    题目链接 洛谷P3763 题解 后缀数组裸题 在BZOJ被卡常到哭QAQ #include<algorithm> #include<iostream> #include< ...

  6. P3758 [TJOI2017]可乐

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  7. 洛谷P3760 - [TJOI2017]异或和

    Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...

  8. 洛谷P3759 - [TJOI2017]不勤劳的图书管理员

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  9. Luogu P3758 [TJOI2017]可乐 | 矩阵乘法

    题目链接 让我们先来思考一个问题,在一张包含$n$个点的图上,如何求走两步后从任意一点$i$到任意一点$j$的方案数. 我们用$F_p(i,j)$来表示走$p$步后从$i$到$j$的方案数,如果存储原 ...

随机推荐

  1. Android学习总结(九)———— 内容提供器(ContentProvider)

    一.内容提供器基本概念 内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.详细资料请看下图: 二.示例 ...

  2. COGS 1913. AC自动机

    ★★   输入文件:ACautomata.in   输出文件:ACautomata.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 对,这就是裸的AC自动机. 要求:在 ...

  3. 历史管理 onhashchange

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. python基础一 day13 复习

    # 函数 —— 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),* ...

  5. 用python编写九九乘法表

    for i in range(1,10): for j in range(1,10): if j >i: print(end='') else: print(j,'*',i,'=',i*j,en ...

  6. 洛谷 P2668 斗地主

    毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...

  7. javascript中typeof、undefined 和 null

    typeof 是运算符,注意不是函数,是运算符,其作用,是考察变量究竟是什么类型.或曰,是变量是否定义或是否初始化的照妖镜.返回值是字符串. undefined 表示一个对象没有被定义或者没有被初始化 ...

  8. javase(14)_java基础增强

    一.Eclipse的使用 1.在eclipse下Java程序的编写和run as,debug as,及java运行环境的配置. 2.快捷键的配置,常用快捷键: •内容提示:Alt + / •快速修复: ...

  9. ios调试技巧

    一.概述1.掌握调试技巧,调试技术最基本,最重要的调试手段包括:单步跟踪,断点,变量观察等.单步跟踪(Step)所谓单步跟踪是指一行一行地执行程序,每执行一行语句后就停下来等待指示,这样你就能够仔细了 ...

  10. PAT 乙级 1005

    题目 题目地址:PAT 乙级 1005 题解 本题主要就在于将一个数的一系列计算结果不重复地存储起来并便于检索,考虑到STL中的集合有相似的特性,使用set可以有效地简化代码和运算. 过程如下: (初 ...