原题链接:洛谷P3758 [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: 复制

3 2
1 2
2 3
2

输出样例#1: 复制

8

说明

【样例解释】

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。

题解

题意:给定一个无向图,一个机器人每一秒可以留在原地,自爆或走一步,求在t秒内机器人所有行动的可能性

算法:邻接矩阵+矩阵乘法

建模:图直接建,留在原地则让每一个点向自己连边,自爆则设一个点为爆炸,每一个点向爆炸点连边(爆炸点向自己连边)

base.m[0][0]=1;
for(int i=1;i<=L;i++){base.m[i][i]=base.m[i][0]=1;
}
for(int i=1;i<=M;i++){int ii,jj;scanf("%d%d",&ii,&jj);base.m[ii][jj]=base.m[jj][ii]=1;
}

设f[i][j][t]为从i到j进过t秒的行动方案数,类似于Floyd的转移,有f[i][j][t1+t2]=∑f[i][k][t1]+f[k][j][t1]

设f[][][x]为f[x],故矩阵f[t1+t2]=f[t1]*f[t2],即可用矩阵乘法,而此题答案就为f[1]t,矩阵快速幂即可

矩阵乘法及快速幂:

inline matrix operator*(matrix x,matrix y){matrix ret;for(int i=0;i<=L;i++){for(int j=0;j<=L;j++)for(int k=0;k<=L;k++)ret.m[i][j]=(ret.m[i][j]+x.m[i][k]*y.m[k][j])%MOD;}return ret;
}
inline matrix operator^(matrix x,int p){matrix ret;ret.build();while(p){if(p&1)ret=ret*x;x=x*x;p>>=1;}return ret;
}

View Code

核心代码:

ans=(base^T);
LL sum=0;
for(int i=0;i<=L;i++){sum=(sum+ans.m[1][i])%MOD;
}

完整代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int MOD=2017,MAXL=32;
 5 int L,M,T;
 6 struct matrix{
 7     LL m[MAXL][MAXL];
 8     matrix(){
 9         memset(m,0,sizeof(m));
10     }
11     inline void build(){
12         memset(m,0,sizeof(m));
13         for(int i=0;i<=L;i++)
14             m[i][i]=1;
15     }
16     inline void print(){
17         for(int i=0;i<=L;i++,putchar('\n'))
18             for(int j=0;j<=L;j++)
19                 printf("%lld ",m[i][j]);
20         putchar('\n');
21     }
22 };
23 inline matrix operator*(matrix x,matrix y){
24     matrix ret;
25     for(int i=0;i<=L;i++){
26         for(int j=0;j<=L;j++)
27             for(int k=0;k<=L;k++)
28                 ret.m[i][j]=(ret.m[i][j]+x.m[i][k]*y.m[k][j])%MOD;
29     }
30     return ret;
31 }
32 inline matrix operator^(matrix x,int p){
33     matrix ret;
34     ret.build();
35     while(p){
36         if(p&1)
37             ret=ret*x;
38         x=x*x;
39         p>>=1;
40     }
41     return ret;
42 }
43 int main(){
44     scanf("%d%d",&L,&M);
45     matrix ans,base;
46     ans.build();
47     base.m[0][0]=1;
48     for(int i=1;i<=L;i++){
49         base.m[i][i]=base.m[i][0]=1;
50     }
51     for(int i=1;i<=M;i++){
52         int ii,jj;
53         scanf("%d%d",&ii,&jj);
54         base.m[ii][jj]=base.m[jj][ii]=1;
55     }
56     scanf("%d",&T);
57     ans=(base^T);
58     LL sum=0;
59     for(int i=0;i<=L;i++){
60         sum=(sum+ans.m[1][i])%MOD;
61     }
62     printf("%lld",sum);
63     return 0;
64 }

View Code

转载于:https://www.cnblogs.com/guoshaoyang/p/10853573.html

洛谷P3758 [TJOI2017]可乐相关推荐

  1. 洛谷 P3758 [TJOI2017]可乐

    洛谷 P3758 [TJOI2017]可乐 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行 ...

  2. [洛谷P3758][TJOI2017]可乐

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

  3. P3758 [TJOI2017]可乐

    P3758 [TJOI2017]可乐 这个题是利用了邻接矩阵的性质 即:对于一个邻接矩阵\(E\),表示从\(E[i][j]\)到\(i\)到\(j\)路径长度为1的方案数是多少.那么\(E^k[i] ...

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

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

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

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

  6. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组

    题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打乱顺序的书, ...

  7. 洛谷 P5740 【深基7.例9】最厉害的学生 题解

    Hello!这是我第一次在CSDN社区发题解呢(虽然我只是一个小菜鸡,只会C++,啥也不懂)! 这一次的题解我给大家带来了洛谷 函数与结构体部分的P5740 最厉害的学生这道题. 我们可以先审一审题目 ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

最新文章

  1. 旷视提出AutoML新方法,在ImageNet取得新突破 | 技术头条
  2. 【聚能聊有奖话题】今日头条公布算法原理,你认可他们的理念吗?
  3. 特征锦囊:怎么批量把特征中的离群点给处理下?
  4. 取得Access自增标识字段在插入数据后的id值
  5. spring tiles_Spring MVC 3模板和Apache Tiles
  6. 【Antlr】Antlr将词法符号送入不同的通道
  7. centos6.5下的mysql5.6.30安装
  8. pytorch学习笔记(五):线性回归的简洁实现
  9. 代码实现抖音时钟罗盘
  10. android项目中如何导入model
  11. IDEA插件系列(41):Code Reading Note插件——代码阅读笔记
  12. 双击 计算机 打不开,电脑双击桌面图标打不开的解决方法
  13. python矩阵求每个元素平方矩阵
  14. 易语言MYSQL记账工具_易语言做记账软件
  15. 刚构桥的优缺点_桥梁钢结构特点及优缺点
  16. Mac锁屏 设置快捷键
  17. 学计算机英语的心得体会,英语学习心得体会
  18. 内网穿透是什么?哪些作用?
  19. 云平台编程与开发(一):云平台服务商一览
  20. 初级java编程实现数学问题鸡和兔子共35个脑袋94个足

热门文章

  1. 74160ENT引脚设计法+同步置数法接成365进制加法计数电路
  2. OpenSSL C++简单应用
  3. Git详解之七:自定义Git
  4. 如何写出高质量的技术博客
  5. 高效沟通【管理学之四】
  6. E-CATT 录入测试数据的方法
  7. python字符串常用操作方法(二)
  8. MySQL-第七章-xtrabackup(XBK)工具使用
  9. ? 精美图文带你掌握 JVM 内存布局
  10. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集