首页 > 其他分享 >NC20909 游戏

NC20909 游戏

时间:2023-08-27 20:34:25浏览次数:42  
标签:const mat Matrix int 朋友 NC20909 游戏

题目链接

题目

题目描述

有 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;
}

标签:const,mat,Matrix,int,朋友,NC20909,游戏
From: https://www.cnblogs.com/BlankYang/p/17660769.html

相关文章

  • 基于JavaWeb的游戏信息管理系统设计与实现-计算机毕业设计源码
    摘要随着信息技术的发展,基于web模式的管理系统逐渐普及,网上查找信息是目前广受欢迎的模式。基于JavaWeb的游戏信息管理系统可以适应现代化快节奏的游戏方式,满足各类人群足不出户的在线查找游戏,利用基于JavaWeb的游戏信息管理系统可以获取游戏的排名信息,并可以记录个人的游戏数据,......
  • 【Land of Lisp】一次练习:巫师文本冒险游戏
    绪论CommonLisp是一门多范式语言,支持多种编程模式,包括面向对象编程、函数式编程。但CommonLisp鼓励函数式编程,并且包含有许多函数式编程相关的功能。《LandofLisp》是一本寓教于乐的学习Lisp语法的书籍。这本书配以漫画插图来进行表达,并且将小游戏的制作作为演示和练习实例......
  • Java猜拳小游戏
    以下代码是一个猜拳小游戏的实现,其中包含了用户输入、随机数生成、逻辑判断和输出结果等功能。首先让用户输入名字,然后每轮循环中用户输入出拳手势,根据输入的数字1、2、3分别代表石头、剪刀、布;同时,系统也会产生一个随机数表示电脑出拳手势。判断用户和电脑的胜负关系,并输出结果。......
  • 黑魂239 呼叫游戏物件
    首先在状态机里新建一个lock的布尔值和lock的状态。  改完之后还得把转态时间改成0。 然后下一步我们要测这个lock和导演模块的自定义导轨的关联,先在脚本ActorManager里新建一个函数。 然后在playablebehaviour里修改成这样。 最后是这样,可以从导演模块里找到是哪......
  • 21.2048小游戏
    跟着教学视频来做,但是视频不完整的,还缺一部分,后面的是我自己独自完成的,嘿嘿嘿这是初步的作品,也就三百多行代码packagemyGame2048;publicclassStartGame_2048{publicstaticvoidmain(String[]args){newGameFrame_2048();}}packagemyGame2048;......
  • 【秘籍揭秘】如何高速下载游戏、Switch资源?省时省力一网打尽!
    百度云盘SVIP合租啦亲爱的考研党和游戏玩家们,我今天要分享的是一份独家秘籍!......
  • 欢乐动物世界打怪游戏app软件
      游戏大部分人都玩过,各种类型的游戏层出不穷,其中打怪的游戏更受欢迎,众多的打怪游戏欢乐动物世界与其他的游戏不同,该游戏的画面和打斗的创新吸引了不少的玩家参与进来。  欢乐动物世界打怪游戏app软件的游戏背景设定在一个充满欢乐和生机的动物世界中,玩家可以扮演不同的动......
  • 2023年小程序游戏可以玩出哪些花样?
    疫情过后,一地鸡毛。游戏行业的日子也不好过。来看看移动游戏收入:2022年,移动游戏收入达到920亿美元,同比下降6.4%。这告诉我们,2022年对移动游戏市场来说是一个小挫折。但不管是下挫还是上升,移动游戏市场依然代表了大趋势,手机游戏在全球游戏市场中占据的份额也越来越大。据Newzoo的数......
  • java中猜数字的小游戏
    importjava.util.Random;importjava.util.Scanner;publicclasscaishuzi{publicstaticvoidmain(String[]args){Randomrandom=newRandom();intmath=random.nextInt(100);Scannerscanner=newScanner(System.in);......
  • P3825 [NOI2017] 游戏 题解
    P3825[NOI2017]游戏题解首先解决没有x的情况,这种情况下每个事件有两种选择,例如a可以选择b,c,所以这就是一个2-SAT问题,但是这题比较特殊,除了题目中给的命题,还需要建立原命题的逆否命题所对应的边,最后跑一遍\(\text{Tarjan}\)就出解了。考虑有\(d\)个\(x\)的情况......