`
isiqi
  • 浏览: 16036651 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

矩阵快速二分求n次幂

 
阅读更多
http://ac.jobdu.com/problem.php?id=1081递推数列

同理Fibonacci数列也可以使用矩阵来求,二分求矩阵的n次幂可以达到O(N*lgN)的时间复杂度。。

(2^n)%k的问题也可以使用这个二分的方法来求解。。

#include<iostream>
#include<cstdio>
using namespace std;

struct Matrix
{
	int a[2][2];
};

Matrix E;

void InitE(int size)       //初始化单位矩阵
{
	for(int i=0;i<size;i++)
	{
		for(int j=0;j<size;j++)
			E.a[i][j]=(i==j);
	}
}
Matrix MatrixMul(Matrix a,Matrix b)     //两矩阵相乘   
{
	Matrix c;
	int i,j,k;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			c.a[i][j]=0;
			for(k=0;k<2;k++)
			{
				c.a[i][j] += ((a.a[i][k]%10000)*(b.a[k][j]%10000));
				c.a[i][j]%=10000;
			}
		}
	}
	return c;
}
Matrix MatrixPow(Matrix a,int n)         //矩阵快速二分求n次幂
{
	Matrix t=E;
	while(n>0)
	{
		if(1&n)     //n是奇数
			t=MatrixMul(t,a);
		a=MatrixMul(a,a);
		n >>= 1;
	}
	return t;
}

int main(void)
{
	int a0,a1,p,q,k;
	Matrix matrix,m;
	InitE(2);
	while(scanf("%d %d %d %d %d",&a0,&a1,&p,&q,&k)!=EOF)
	{
		if(!k)        //这两个特殊情况当时未考虑,导致多次WA
			printf("%d\n",a0);
		else if(k==1)
			printf("%d\n",a1);
		else
		{
			matrix.a[0][0]=p;     //构造初始矩阵
			matrix.a[0][1]=q;
			matrix.a[1][0]=1;
			matrix.a[1][1]=0;
			m=MatrixPow(matrix,k-1);
			printf("%d\n",(m.a[0][0]*a1+m.a[0][1]*a0)%10000);
		}
	}
	return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=2035快速二分求幂A^B

#include<iostream>
using namespace std;
#include<stdio.h>

inline int Pow(int x,int k,int mod)    //快速二分求幂x^k
{
	int ans=1;
	while(k)
	{
		if(k&1)
		{
			ans*=x;
			if(ans>=mod)
				ans%=mod;
		}
		x*=x;
		if(x>=mod)
			x%=mod;
		k>>=1;
	}
	return ans;
}

int main(void)
{
	int a,b;
	while(scanf("%d %d",&a,&b) && a && b)
	{
		printf("%d\n",Pow(a,b,1000));
	}
	return 0;
}


分享到:
评论

相关推荐

    二阶方阵n次幂的普适公式及应用 (2012年)

    采用矩阵变换及复数变换等研究方法,给出了二阶方阵n次幂的通用公式,给出了分式差分方程、二阶线性差分方程及差分方程组的完全解,应用该公式得到了二端梯形电阻网络等效电阻的通用公式.所得结果可使相关问题中的计算...

    计算机考研机试攻略 - 满分篇.pdf

    目录 写在前面的话 2 ...4.5 矩阵快速幂 51 4.6 区间类型动态规划 52 4.7 数位类型动态规划 52 4.8 树上的动态规划 53 4.9平衡二叉树的问题 54 完结撒花 56 N诺考研系列图书 58 N诺网校招募令 59

    浙江大学C语言上机练习题附答案

    20038 求x的n次幂 9 20041 生成 3 的乘方表 10 20044 求100^0.5+101^0.5+……+1000^0.5 10 20053 计算物体自由下落的距离 11 20056 计算分段函数 11 20061 阶梯电价 12 20062 求m*m+1/m+(m+1)*(m+1)+1/(m+1)+...

    科学与工程数值计算算法

    5.15 第二种边界条件的三次样条函数插值、微商与积分 5.16 第三种边界条件的三次样条函数插值、微商与积分 5.17 二元三点插值 5.18 二元全区间插值 第6章 数值积分 6.1 数值积分类设计 6.2 变步长梯形求...

    易语言-高效数据结构及算法模块

    举个例子:对超大数组进行排序,如果你用传统的选择排序(O(n^2))对一个超大数组进行排序,你恐怕得等几分钟,而采用二分思想的快速排序(最坏情况O(nlogn),最好情况O(n)),最好情况只需要很短时间。量化一下,...

    实用数学工具企业版(可以计算超复杂的数学表达式)

    灰色预测模型 一元线性回归模型 二次曲线分析模型 三次曲线分析模型 指数分析模型 对数分析模型 倒指数预测模型 双曲线预测模型 逻辑曲线预测模型逻辑例指数预测模型 幂函数预测模型 幂指函数预测模型 倒幂指函数...

    C程序范例宝典(基础代码详解)

    实例211 求任意数n次幂 299 7.3 字符串、字符函数 300 实例212 函数实现字符匹配 300 实例213 任意大写字母转小写 301 实例214 字符串复制到指定空间 302 实例215 查找位置信息 303 7.4 其他函数 304 ...

    c语言经典案例

    实例122 求任意数的n次幂 161 实例123 固定格式输出当前时间 163 实例124 设计函数计算学生平均身高 164 实例125 求数组元素中的最小值 165 实例126 打印1~5的阶乘 166 实例127 求最大公约数和最小公倍数 167 实例...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    11.1.2 二分查找 246 11.1.3 硬件算法 247 11.2 整数立方根 249 11.3 求整数幂 250 11.3.1 用n的二进制分解式计算xn 250 11.3.2 用Fortran语言计算2n 251 11.4 整数对数 252 11.4.1 以2为底的整数对数 253 ...

    数据结构(C++)有关练习题

    6、 用C++编写求多项式的和与积的算法,要求如下: a. 要求从键盘分别输入2个多项式的系数以及最高次幂; b. 通过重载操作符+和*,完成多项式的和与积的计算; c. 输出运算结果; 7、 编写一个程序...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    6.14 递归法求幂 6.15 汉诺Hanoi塔 6.16 选美比赛 第7章 数据结构趣题 7.1 顺序表的就地逆置 7.2 动态数列排序 7.3 在原表空间进行链表的归并 7.4 约瑟夫环 7.5 二进制/八进制转换器 7.6 回文字符串的判定 7.7 ...

    ACM 算法经典代码 数据结构经典代码

    目录 一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 ...4.二分查找 数据结构: 1.顺序队列 2.顺序栈 3.链表 4.链栈 5.二叉树

    leetcode打不开-CS-Topic-Notes:我在Markdown格式的面试中关于CS主题的笔记

    最大二分匹配 Hopcroft–Karp 算法 流量和削减: 流量网络 最大流量 福特-福克森/埃德蒙兹-卡普 最小削减 最大流量和最小切割 匹配项: 稳定的婚姻 盖尔-沙普利 图形着色: 贪吃的着色 四色定理 五色定理 k-退化图 ...

    leetcode分类-Leetcode:力码

    遍历二维数组(矩阵)的方法 技巧 011 装有最多水的容器,时间为 O(n)。 证明正确。 004 时间复杂度为 O(log(n)) 的两个排序数组的中位数 017 字母组合。 数组遍历。 020 如何递归定义括号字符串的有效性并找出一种...

    leetcode1004-leetcode:力扣笔记

    官方解决方案:矩阵求幂,复杂度(时间/空间)O(log n) / O(log n) 官方解:黄金比例/比奈公式,复杂度(时间/空间)O(1) / O(1) [341] 展平嵌套列表迭代器 - 中 堆栈解决方案 分布式文件系统 [1074] 与目标相加的...

    MATLAB中DEA代码-Ludus:ludus[ludi,m。,o-Dekl。]-学校,比赛

    MATLAB中DEA代码Ludus ...求幂,平方和: 转换双系统: 转换三元系统: 转换十六进制系统: Gram-Schmidt的正交化方法: 双射Z &lt;-&gt; N: 数据结构 堆:, 树: 列表:, 哈希图: 堆: 自动售货机 堆

    Java范例开发大全 (源程序)

     实例213 二分查找法的实现方法 377  实例214 模拟操作系统的进程调度 379  实例215 利用栈将字符串逆序输出 381  实例216 动态的数组链表 382  实例217 你能猜出鱼是谁的宠物吗? 387  实例218 使用...

    java范例开发大全(pdf&源码)

    实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的...

    java范例开发大全源代码

     实例183 求n的幂数与倍数 304  实例184 商品订单 306  实例185 多功能排序 310  第11章 Java常用类(教学视频:66分钟) 315  11.1 数学Math类 315  实例186 求圆周率∏值 315  实例187 求对...

Global site tag (gtag.js) - Google Analytics