fzu 1911 Construct a Matrix(矩阵快速幂+规律)

原创 2013年12月04日 23:24:20

题目链接:fzu 1911 Construct a Matrix


题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和。r = s[n] % m。构造一个r * r的矩阵,只能使用-1、0、1。使得矩阵的每行每列的和都不相同,输出方案,不行的话输出No。


解题思路:求r的话用矩阵快速幂求,每次模掉m,

{ {1, 1, 0}, {1, 0, 0}, {1, 1, 1} } * { f[i], f[i -1], s[i] } = { f[i + 1], f[i], s[i + 1] }.


然后求出r后,若r是奇数或0,则矩阵不存在;r为偶数时,只要按照规律建立矩阵就可以了。


#include <stdio.h>
#include <string.h>

const int M = 10;
const int N = 205;

int n, m, r;

struct Mul {
	int s[M][M];
	Mul() {	memset(s, 0, sizeof(s));	}
	Mul operator * (const Mul& c) {
		Mul ans;

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				ans.s[i][j] = 0;
				for (int k = 0; k < 3; k++)
					ans.s[i][j] = (ans.s[i][j] + s[i][k] * c.s[k][j] ) % m;
			}
		}
		return ans;
	}

	void put() {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++)
				printf("%d ", s[i][j]);
			printf("\n");
		}
	}
};

Mul MulPow(Mul a, int t) {
	if (t == 1) return a;

	Mul x = MulPow(a, t / 2);

	x = x * x;

	if (t % 2) x = x * a;

	return x;
}

void init() {
	if (n > 2) {
		Mul a;
		a.s[0][0] = a.s[0][1] = a.s[1][0] = a.s[2][0] = a.s[2][1] = a.s[2][2] = 1;

		Mul ans = MulPow(a, n - 2);

		r = (ans.s[2][0] + ans.s[2][1] + ans.s[2][2] * 2) % m;
	} else if (n == 2) {
		r = 2 % m;
	} else if (n == 1) {
		r = 1;
	}
}

void solve() {
	if (r == 0 || r % 2)
		printf("No\n");
	else {
		int v[N][N];
		memset(v, -1, sizeof(v));
		printf("Yes\n");

		for (int i = 1; i <= r; i++) {
			int tmp;
			if (i % 2) {
				tmp = (r + i + 1) / 2;
				v[tmp][i] = 0;
			} else
				tmp = (r - i) / 2;
			for (int j = tmp + 1; j <= r; j++)
				v[j][i] = 1;
		}

		for (int i = 1; i <= r; i++) {
			for (int j = 1; j < r; j++)
				printf("%d ", v[i][j]);
			printf("%d\n", v[i][r]);
		}
	}
}

int main () {
	int cas;
	scanf("%d", &cas);
	for (int i = 1; i <= cas; i++) {
		scanf("%d%d", &n, &m);
		printf("Case %d: ", i);

		init();

		solve();	
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

fzu1911 (Construct a Matrix) 矩阵快速幂+构造

Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...

Kiki & Little Kiki 2(找规律+矩阵快速幂的应用)

Link:http://acm.hdu.edu.cn/showproblem.php?pid=2276 Kiki & Little Kiki 2 Time Limit: 2000/...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

解题报告:FZU1692 Key problem 循环矩阵快速幂

Problem 1692 Key problem Accept: 196    Submit: 862 Time Limit: 1000 mSec    Memory Limit : 327...

FZU 1683 纪念SlingShot(矩阵快速幂)

题目地址:FZU 1683 这题一开始用的二分矩阵,于是就一直TLE。后来找题解才发现,可以不用二分矩阵,因为这个题最终求的是一个值,所以可以把那个值加入到构造的矩阵中: 这样就不用二分矩...

FZu 1683 纪念SlingShot 矩阵快速幂

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683

FZU 2198 快来快来数一数 (dp + 矩阵快速幂)

题意: 中文题很明显了 分析: dp[i]:=前i−1个六边形的生成树个数已经计算出来,到第i个六边形的生成树个数dp[i]:= 前i-1个六边形的生成树个数已经计算出来, 到第i个六边形的生...
  • lwt36
  • lwt36
  • 2015-10-08 02:54
  • 486

FZU 2040 Tiling (矩阵快速幂)

题目地址:FZU 2040 重点在于构造矩阵,先状压,然后根据每一行是否与下一行分割了来构造一个2^(m-1)*2^(m-1)的矩阵,然后套上矩阵快速幂就可以了。937ms险过。。 代码如下:#i...

HDU 2276 & FZU 1692 (矩阵快速幂+循环同构优化)

HDU 2276题意:给定一个01**字符串环**(2<=字符串长度1 , 1->0 比如当前的状态为100101那么一秒过后的状态为010111。思路:用公式表示变化状态其实就是: ai=(a(...

FZU Problem 2198 快来快来数一数(矩阵快速幂 卡常数 +优化)

FZU Problem 2198 快来快来数一数(矩阵快速幂 卡常数 +优化)

FZU - 1692 Key problem (矩阵快速幂)

Whenever rxw meets Coral, he requires her to give him the laboratory key. Coral does not want to giv...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)