HDU-1005 Number Sequence【矩阵二分幂】

news/2024/7/4 1:28:05 标签: matrix, class, c
cle class="tags" href="/tags/CLASS.html" title=class>class="baidu_pl">
cle_content" class="tags" href="/tags/CLASS.html" title=class>class="article_content clearfix">
content_views" class="tags" href="/tags/CLASS.html" title=class>class="htmledit_views">

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

题目大意:

给你一个递推公式࿰c;求出第n项。由于某项可能太大࿰c;所以取余7

解题思路:

矩阵二分幂的经典运用。


代码如下:

<code class="tags" href="/tags/CLASS.html" title=class>class="language-cpp">#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;

#define CLR(arr, what) memset(arr, what, sizeof(arr))
typedef long long LL;
const LL Size = 3;
const LL MOD = 7; //取余

class="tags" href="/tags/CLASS.html" title=class>class Matrix67
{
public:
	Matrix67(const LL ff1, const LL ff2, const LL aa, const LL bb, const LL cc, const LL nn); //构造函数
	void copymat(LL mata[Size][Size], LL matb[Size][Size]); //矩阵复制:后->前
	void binary(LL n); //矩阵二分幂:次数
	void multiply(LL mata[Size][Size], LL matb[Size][Size]); //矩阵连乘
	LL result(); //打印结果

private:
	LL f1, f2, a, b, c, n;
	LL mat[Size][Size], temp[Size][Size], mid[Size][Size]; //二分幂、递推、单位矩阵
};

Matrix67::Matrix67(const LL ff1, const LL ff2, const LL aa, const LL bb, const LL cc, const LL nn)
{
	CLR(mat, 0); CLR(temp, 0); CLR(mid, 0);
	f1 = ff1, f2 = ff2, a = aa, b = bb, c = cc, n = nn;
	mat[0][1] = aa, mat[1][0] = 1, mat[1][1] = bb, mat[2][1] = 1, mat[2][2] = 1; //初始化单位矩阵
	temp[0][0] = ff1, temp[0][1] = ff2, temp[0][2] = cc; //初始化递推矩阵
	copymat(mid, mat);
}

void Matrix67::copymat(LL mata[Size][Size], LL matb[Size][Size])
{
	for(int i = 0; i < Size; ++i)
		for(int j = 0; j < Size; ++j)
			mata[i][j] = matb[i][j];
}

void Matrix67::binary(LL n)
{
	if(n == 1)
		return ;
	binary(n >> 1);
	multiply(mat, mat);
	if(n & 1) //奇次幂
		multiply(mat, mid);
}

void Matrix67::multiply(LL mata[Size][Size], LL matb[Size][Size])
{
	LL sum, tempmat[Size][Size];
	for(int i = 0; i < Size; ++i)
	{
		for(int j = 0; j < Size; ++j)
		{
			sum = 0;
			for(int k = 0; k < Size; ++k)
				sum = (sum + mata[i][k] * matb[k][j]) % MOD;
			tempmat[i][j] = (sum + MOD) % MOD;
		}
	}
	copymat(mata, tempmat);
}

LL Matrix67::result()
{
	if(n > 1)
	{
		binary(n - 1);
		multiply(temp, mat);
	}
	return (temp[0][0] % MOD + MOD) % MOD; //temp[0][1]是f(n+1)࿰c;注意~
}

int main()
{
	LL a, b, n;
	while(scanf("%lld%lld%lld", &a, &b, &n) && a && b && n)
	{
		Matrix67 m(1, 1, b, a, 0, n); //af(n-1)+bf(n-2),顺序调换~~
		printf("%lld\n",m.result() % MOD);
	}
	return 0;
}code>


cle>

http://www.niftyadmin.cn/n/1516655.html

相关文章

python对文件的读操作方法readall_python对文件进行读写操作

python进行文件读写的函数是open或filefile_handler open(filename,,mode)Table mode模式描述r以读方式打开文件&#xff0c;可读取文件信息。w以写方式打开文件&#xff0c;可向文件写入信息。如文件存在&#xff0c;则清空该文件&#xff0c;再写入新内容a以追加模式打开文件…

S3C2410下WinCE6.0的启动过程详解

通过前两篇文章的介绍&#xff0c;我们已经知道NBOOT用来引导EBOOT&#xff0c;继而EBOOT加载并引导WinCE操作系统(NK)。那么&#xff0c;WinCE6.0的启动过程又是怎样的呢&#xff1f;本文基于S3C2410的平台做一个详细的分析。需要说明的是&#xff0c;WinCE6.0的整个启动过程对…

NYOJ-301 递推求值【矩阵二分幂】

题目链接&#xff1a;http://acm.nyist.net/JudgeOnline/problem.php?pid301 解题思路&#xff1a; 典型的矩阵二分幂。 代码如下&#xff1a; #include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> #…

POJ-3070 Fibonacci【矩阵二分幂】

题目链接&#xff1a;http://poj.org/problem?id3070 解题思路&#xff1a; 矩阵二分幂&#xff0c;模板题~~~~~水过 代码如下&#xff1a; #include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> #in…

java单引号_Java十四天零基础入门-Java字面量

不闲聊&#xff01;&#xff01;&#xff01;不扯淡&#xff01;&#xff01;&#xff01;小UP只分享Java相关的资源干货本章节目标&#xff1a;理解变量本质是什么&#xff0c;在开发中有什么用&#xff1f;变量三要素是什么&#xff1f;怎么声明变量&#xff1f;怎么给变量赋…

WINCE开机自动运行指定程序

WINCE开始默认是运行explorer.exe&#xff0c;是在shell.reg中设置的 [HKEY_LOCAL_MACHINE/init]"Launch50""explorer.exe""Depend50"hex:14,00, 1e,00 因此只要在platform.reg或者project.reg中做类似的更改就可以实现开机自动运行指定AP的功…

wince datagrid数据居中设置_年终总结PPT,一定少不了数据图表,教你四步做出高大上的图表...

平时做 PPT 时&#xff0c;经常会用到各种图表&#xff0c;来辅助表现内容的逻辑关系。听说很多人都是用形状一个个画出来的&#xff0c;我每次看到&#xff0c;都又羡慕又害怕。最常见的就是下边这样的逻辑图表&#xff1a;如果是你来做&#xff0c;中间这个逻辑图怎么在PPT里…

大数是否为素数【费马小定理+Carmichael数判断】

作为判断一个大数是否为素数的模板。 代码如下&#xff1a; #include<stdio.h> #include<algorithm> #include<iostream> using namespace std;long long multi(long long a,long long b,long long mod) {long long temp a,sum 0;while(b){if(b&1) sum…