`

【矩阵乘法+快速取幂模】HDU 1575 Tr A

阅读更多
http://acm.hdu.edu.cn/showproblem.php?pid=1575

Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。

Output
对应每组数据,输出Tr(A^k)%9973。

Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9

Sample Output
2
2686


#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
//#include <map>
#include <queue>
#include <utility>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <ctype.h>
using namespace std;
#define L __int64
#define inf 0x3fffffff

int res[15][15], n;

void mul (int a[][15], int b[][15], int c, int res[][15])    //矩阵乘法
{
    int s[15][15] = {0}, y, i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            for (y = 0; y < n; y++)
                s[i][j] = (s[i][j] + a[i][y] * b[y][j]) % c;    //乘的同时模
    memcpy (res, s, sizeof(s));
}

void qpow (int a[][15], int b, int c)    //快速取幂模
{
    while (b)
    {
		if (b & 1)
			mul (res, a, c, res);
        mul (a, a, c, a);
		b >>= 1;
    }
}

int main()
{
    int t, k, i, j, a[15][15], ans;
    scanf ("%d", &t);
    while (t--)
    {
        scanf ("%d%d", &n, &k);
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                res[i][j] = (i==j);
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                scanf ("%d", a[i]+j);
        qpow (a, k, 9973);
        ans = 0;
        for (i = 0; i < n; i++)
            ans += res[i][i];    //主对角线上元素之和
        printf ("%d\n", ans%9973);
    }
    return 0;
}


简化&小技巧 模板:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <utility>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
//#include <ctime>
#include <ctype.h>
using namespace std;
#define L long long
#define inf 0x3fffffff
#define FF(i, n) for (i = 0; i < n; i++)
#define M 11		//阶数

int ret[M][M];		//结果矩阵
int init[M][M];		//初始矩阵
int tp[M][M];		//中间变量矩阵

void matmul (int a[][M], int b[][M], int n, int mod)
{
    int i, j, k;
    FF(i, n) FF(j, n) tp[i][j] = 0;
    FF(i, n) FF(k, n) if (a[i][k]) FF(j, n) if (b[k][j])
        tp[i][j] = (tp[i][j] + a[i][k] * b[k][j]) % mod;
    memcpy (a, tp, sizeof(tp));
}

void qmod (int n, int b, int mod)
{
    int i, j;
    FF(i, n) FF(j, n) ret[i][j] = (i==j);
    for ( ; b; b >>= 1)
    {
        if (b & 1)
            matmul (ret, init, n, mod);
        matmul (init, init, n, mod);
    }
}

int main()
{
    int t, n, k, i, j, sum;
    scanf ("%d", &t);
    while (t--)
    {
        scanf ("%d%d", &n, &k);
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                scanf ("%d", init[i]+j);
        qmod (n, k, 9973);
        sum = 0;
        for (i = 0; i < n; i++)
            sum = (sum + ret[i][i]) % 9973;
        printf ("%d\n", sum);
    }
    return 0;
}
1
9
分享到:
评论

相关推荐

    [2018 ACM-ICPC 焦作赛区网络赛] G - Give Candies(找规律+快速幂)

    可以达到10^100000,我们只能用字符串读这个数,这样的话我们肯定不能直接用快速幂算,其实有一个性质,2^N模一个质数,它的结果是具有周期性的,周期长度为mod-1,这道题就利用这个周期 性,具体步骤就是:先把N...

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    背包问题模板 hdu2191

    背包问题模板 hdu2191 背包问题是计算机科学中一种经典的NP完全问题,它是指给定一个容量为V的背包和N种物品,每种物品具有价值和重量,如何选择物品放入背包,使得总价值最大化且总重量不超过背包容量。背包问题有...

    hdu.rar_hdu

    7. **模板代码**:如快速幂、二分查找、DFS/BFS等常用算法的通用实现。 8. **问题解决策略**:理解题目需求、设计合适的数据结构、分析时间复杂度和空间复杂度、调试和优化代码。 9. **调试技巧**:使用调试工具...

    hdu 1753 大明A+B

    现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 Input 本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。 Output 请在一行里面...

    HDU题目java实现

    9. **动态规划**:这是一种优化策略,通过构建状态转移方程来求解问题,例如背包问题、最长公共子序列、矩阵链乘法等。 10. **回溯法**:在解决组合优化问题和逻辑推理问题时常用,如八皇后问题、数独求解等。 11....

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU+2000-2099+解题报告.zip

    1. **动态规划**:动态规划是一种用于解决最优化问题的常用方法,例如背包问题、最长公共子序列、矩阵链乘法等。解题报告会解释如何定义状态、设计状态转移方程,并给出具体代码实现。 2. **图论算法**:包括最短...

    hdu 300+ AC 代码

    HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    HDU+2000-2099+解题报告

    例如背包问题、最长公共子序列、矩阵链乘法等。 3. **图论**:包括最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、最小生成树(Prim、Kruskal)、拓扑排序等。 4. **字符串处理**:如KMP算法、Manacher...

    HDU ACM as easy as a+b

    - **条件判断**:使用 `if` 条件语句来控制程序流程,例如 `if(a&gt;a[i+1])`。 - **数据交换**:通过中间变量 `t` 实现两个变量值的交换,如 `t=a; a=a[i+1]; a[i+1]=t;`。 #### 算法知识点 - **排序算法**:代码中...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU acm-PPT课件

    【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    HDU1059的代码

    HDU1059的代码

Global site tag (gtag.js) - Google Analytics