题目链接

题目

题目描述

有 n 个人围成一个环玩传球游戏,每轮游戏手里拿着球的那个人必须将球传给他(她)的一个朋友。游戏一共进行了 m 轮,初始球在第 a 个人手中,问游戏结束后球在第 b 个人手中的方案数。

多组测试数据。答案对 10^9+7 取模。

输入描述

第一行三个整数 Q,n,m(1≤ Q≤105,n≤200,m≤109),含义如题目所示。

接下来 n 行,每行 n 个整数表示每个人的朋友关系,若第 i 行的第 j 个数为 0 表示 i 与 j 不是朋友,反之亦然。请特别注意本题中朋友关系是有向的。特别地,一个人不能为自己的朋友。

接下来 Q 行,每行两个整数 a,b 分别表示一组询问。

输出描述

输出共 Q 行,每行一个整数,表示答案。

示例1

输入

1 2 1
0 1
1 0
1 1

输出

0

说明

测试数据中共有两个人玩游戏。包含一组询问。

第一个人与第二个人互为朋友。游戏共进行了一轮。

第一次询问中询问游戏结束后第一个人手中仍然有球的方案数。

显然在一轮游戏后,由于每轮传球一个人必须将球传给他(她)的朋友,所以球不可能还在自己手里。

题解

知识点:线性代数,组合数学,运算优化。

众所周知,floyd可以求任意两点之间简单路径条数,因为它限制了每次走的点编号是递增的,所以不会出现回路。

但是如果把这个限制去掉,那运算过程就变成朴素的矩阵乘法,求到的东西就是任意两点之间路径条数(可以有环),就是本题需要的东西,这个过程可以用矩阵快速幂加速。

时间复杂度 \(O(n^3\log m)\)

空间复杂度 \(O(n^2)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; struct Matrix {
const static int P; int n, m;
vector<vector<int>> mat; Matrix(int _n = 0) :n(_n), m(_n), mat(_n + 1, vector<int>(_n + 1)) { for (int i = 1;i <= n;i++) mat[i][i] = 1; }
Matrix(int _n, int _m) :n(_n), m(_m), mat(_n + 1, vector<int>(_m + 1)) {}
Matrix(const vector<vector<int>> &_mat) :n(_mat.size() - 1), m(_mat[1].size() - 1), mat(_mat) {} friend Matrix operator*(const Matrix &A, const Matrix &B) {
Matrix ans(A.n, B.m);
if (A.m != B.n) return ans;
for (int i = 1;i <= A.n;i++)
for (int k = 1;k <= A.m;k++) //a.m == b.n
for (int j = 1;j <= B.m;j++)
ans.mat[i][j] = (ans.mat[i][j] + 1LL * A.mat[i][k] * B.mat[k][j]) % P;
return ans;
} friend Matrix operator^(Matrix A, ll k) {
Matrix ans(A.n);
while (k) {
if (k & 1) ans = ans * A;
k >>= 1;
A = A * A;
}
return ans;
} friend ostream &operator<<(ostream &os, const Matrix &A) {
for (int i = 1; i <= A.n; i++)
for (int j = 1; j <= A.m; j++)
os << A.mat[i][j] << " \n"[i != A.n && j == A.m];
return os;
}
}; const int P = 1e9 + 7;
const int Matrix::P = ::P; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q, n, m;
cin >> q >> n >> m;
Matrix A(n);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
cin >> A.mat[i][j];
A = A ^ m;
while (q--) {
int a, b;
cin >> a >> b;
cout << A.mat[a][b] << '\n';
}
return 0;
}

NC20909 游戏的更多相关文章

  1. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  2. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  3. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  4. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  5. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  6. 漫谈C#编程语言在游戏领域的应用

    0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...

  7. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  8. 趣说游戏AI开发:曼哈顿街角的A*算法

    0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...

  9. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  10. Java程序员:工作还是游戏,是该好好衡量一下了

    前阵子我终于下定决心,删掉了硬盘里所有的游戏. 身为一个程序猿,每天都要和各种新技术打交道,闲暇时间,总还得看一下各大论坛,逛逛博客园啥的,给自己充充电.游戏的话,其实我自小就比较喜欢,可以算是一种兴 ...

随机推荐

  1. idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql

    本文为博主原创,未经允许不得转载: mybatis plus 使用过程中已经很大程度提升了我们开发的效率,因为它内部已经对单表的操作进行了完美的封装,但是关联表操作时, 这时就需要自己定义sql,自定 ...

  2. 【SHELL】查找文件并删除

    find . -iname file-name |xargs -I % rm -rf %

  3. 第二届福州大学至诚学院网络安全大赛G0DCTF Misc WP

    MISC baby_misc 1.题目信息 key文件夹: 还有一张图片 2.解题方法 观察key文件夹里的每个文件信息,发现并无什么有用的,甚至有的为空... 看到文件名称的数字而且还给了图片,可以 ...

  4. K8S增加限制后的启动时间验证

    K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...

  5. [转帖]jmeter正则表达式应用-01篇

    如图所示 1.先新建一个login的http请求,然后再login的请求下新增一个正则表达式提取器,增加一个查看结果树查看结果 假如后端接口返回的数据为"{'msg': 'login suc ...

  6. [转帖]PostgreSQL(三) 内存参数优化和原理(work_mem)内存表 pgfincore插件使用方法

    1.常用内存参数 1.1 shared_buffers shared_buffers是PostgreSQL用于共享缓冲区的内存,是由8kb大小的块所形成的数组.PostgreSQL在进行更新.查询等操 ...

  7. [转帖]金仓数据库KingbaseES数据目录结构

    KingbaseES数据库结构 [kingbase@postgresV8]$ tree -LP2data/ . ├── data │ ├── base # 存储用户创建的数据库文件及隶属于用户数据库的 ...

  8. 【转帖】读懂什么是RDMA

    一.什么是RDMA1.RDMA主要体现     2.如何理解RDMA和TCP技术的区别?3.使用RDMA的好处包括: 二.什么是RoCE?1. RDMA协议包含:Infiniband(IB)2. 为什 ...

  9. [转帖]2022年 SRE、DevOps技能图谱

    https://zhuanlan.zhihu.com/p/568752990 在过去一段时间,我面试过一些 DevOps 相关从业者,并且曾经收到过一些知乎小伙伴的提问,针对于 DevOps 以及相关 ...

  10. Ubuntu18.04 设置ip地址

    1. 自己用vCenter安装了一个ubuntu18.04, 结果因为是 vCenter6.7 只有web界面, 发现GUI操作时鼠标位置不对,没办法只能通过cli的方式设置ip地址. 2. 先简单查 ...