POJ 3233
矩阵分治
注意不要用 (*this) 会改变原值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
int n, p, k;
struct Matrix{
	int num[35][35];
	void clear() {
		memset(num, 0, sizeof(num));
	}
	void unit() {
		clear();
		for(int i = 0; i < 35; i++) num[i][i] = 1;
	}
	Matrix operator * (const Matrix & b) {
		Matrix ans;
		ans.clear();
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= n; j++) {
				int tmp = 0;
				for(int k = 1; k <= n; k++) {
					tmp += num[i][k] * b.num[k][j];
					tmp %= p;
				}
				ans.num[i][j] = tmp;
			}
		}
		return ans;
	}
	Matrix operator + (const Matrix & b) {
		Matrix ans;
		ans.clear();
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= n; j++) {
				ans.num[i][j] = num[i][j] + b.num[i][j];
				ans.num[i][j] %= p;
			}
		}
		return ans;
	}
	Matrix operator ^ (int k) {
		Matrix ans, tmp = (*this);
		ans.unit();
		while(k) {
			if(k & 1) ans = ans * tmp;
			tmp = tmp * tmp;
			k >>= 1;
		}
		return ans;
	}
}a, b;
Matrix work(int cur) {
	if(cur == 1) return a;
	int mid = cur / 2;
	if(mid * 2 == cur) {
		Matrix t = work(mid);
		return t + t * (a ^ mid);
	}else {
		Matrix t = work(mid);
		return t + t * (a ^ mid) + (a ^ cur);
	}
}
int main() {
	cin >> n >> k >> p;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			cin >> a.num[i][j];
			a.num[i][j] %= p;
		}
	}
	b = work(k);
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			printf("%d ", b.num[i][j]);
		}
		printf("\n");
	}
	return 0;
}
POJ 3233的更多相关文章
- POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
		职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9. 这 ... 
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
		不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ... 
- 矩阵十点【两】  poj 1575 Tr A poj 3233 Matrix Power Series
		poj 1575 Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ... 
- Poj 3233 Matrix Power Series(矩阵二分快速幂)
		题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k ... 
- POJ 3233 Matrix Power Series (矩阵+二分+二分)
		题目地址:http://poj.org/problem?id=3233 题意:给你一个矩阵A,让你求A+A^2+……+A^k模p的矩阵值 题解:我们知道求A^n我们可以用二分-矩阵快速幂来求,而 当k ... 
- POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】
		任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ... 
- Matrix Power Series POJ - 3233  矩阵幂次之和。
		矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ... 
- poj 3233 Matrix Power Series  矩阵求和
		http://poj.org/problem?id=3233 题解 矩阵快速幂+二分等比数列求和 AC代码 #include <stdio.h> #include <math.h&g ... 
- poj 3233(矩阵高速幂)
		题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ... 
- POJ 3233 Matrix Power Series 二分+矩阵乘法
		链接:http://poj.org/problem?id=3233 题意:给一个N*N的矩阵(N<=30),求S = A + A^2 + A^3 + - + A^k(k<=10^9). 思 ... 
随机推荐
- FZOJβ #31.字符串
			http://1572m36l09.iask.in:30808/problem/31 首先转化为保留尽量少的段使得字典序最大.考虑逐字符确定,显然我们可以将相同的连续字符缩在一起.注意到字典序最大的字 ... 
- PAT (Basic Level) Practise (中文)-1020. 月饼 (25)
			http://www.patest.cn/contests/pat-b-practise/1020 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量. ... 
- Bootstrap 徽章(Badges)
			本章将讲解Bootstrap徽章(Badges),徽章与标签相似,主要的区别是徽章的圆角比较圆滑. 徽章(Badges)主要用于突出显示新的或未读的项,如果使用徽章,只需要把<span clas ... 
- mysql 安装简介
			Linux: 安装 [root @ localhost ~]# yum install mysql-server 设定为开机自动启动 [root @ localhost ~]# chkconfig m ... 
- C# 调用腾讯地图WebService API获取距离(一对多)
			官方文档地址:https://lbs.qq.com/webservice_v1/guide-distance.html 代码: /// <summary> /// 获取距离最近的点的经纬度 ... 
- POJ-1961-Period(ZOJ-2177)
			这题是最短循环节,然后我们尝试小于字符串长度的所有长度,如果符合,我们就输出. 如果它等于0,说明它不循环,因为之前并没有重复的,如果i%(i-next[i])==0说明它是循环的,然后除一下得到周期 ... 
- linux常用命令(配置查看,定时任务)
			1.查看所有待挂载设备信息 fdisk -l # fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders, total sector ... 
- Unity基础-外部导入C# Dll(汇编集)
			外部导入C# Dll(汇编集) 使用创建一个dll工程 添加依赖的dll 导入Unity中,放入Assets的任意文件夹中 使用代码生成的dll汇编集只要"use dll的名字"引 ... 
- Linux安装配置***客户端
			1.创建root用户 sudo passwd root su root 2.安装shadowsocks sudo apt-get install python-pip sudo pip install ... 
- Python之简单Socket编程
			Socket编程这块儿还是比较重要的,记录一下:实现服务器端和客户端通信(客户端发送系统指令,如ipconfig等,服务器端执行该指令,然后将指令返回结果给客户端再传过去,设置一次最多直接收1024字 ... 
