Java大数——快速矩阵幂

今天做了一道水题,尽管是水题,但是也没做出来。最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了。。。。


题目描述:

给a,b,c三个数字,求a的b次幂对c取余。

数据范围:多组样例循环输入,每一组输入a,b,c (1<=a,c<=10^9,1<=b<=10^1000000)。

输入:

2 2 2
139123 123124121241452124412124 123121

输出:

0

8984


1、首先我们先定义大数变量

BigInteger a,b,c;

2、然后输入大数

a=input.nextBigInteger();
b=input.nextBigInteger();
c=input.nextBigInteger();

3、之后就是快速矩阵幂算法了

  快速矩阵幂就是用二进制来求幂的方法。在说快速矩阵幂之前,我们先看一个例子:A^23 = A^16 * A^4 * A^2 * A。16、4、2、1正好对应的就是23的二进制,即10111。

  当我们计算A^2的时候可以通过A*A来获得;当我们计算A^4的时候,可以通过A^2 * A^2获得;同理我们可以通过A^8 * A^8来得到A^16。这就是快速矩阵幂的思想,复杂度从O(n)降到了O(logn)。

  运算过程如下:

  (用temp记录当前幂的值)当位数==1时,temp*=A,且A=A*A,此时temp=A,A==A^2;

  继续  第二位也==1,继续temp*=A,且A=A*A;此时temp=A^3,A==A^4;

  继续  第三位也==1,继续temp*=A,且A=A*A;此时temp=A^7,A==A^8;

  第四位!=1,继续A=A*A;此时temp=A^7,A==A^16;

  继续  第五位==1,继续temp*=A,且A=A*A;此时temp=A^23,A==A^32;

  之后退出循环,返回结果temp。

  以上只用了5次循环,远远小于23次。

完整代码

 import java.math.*;
import java.util.*;
public class Main { public static BigInteger POW (BigInteger a,BigInteger b,BigInteger c)
{ BigInteger ans = BigInteger.valueOf(1);// 大数 1
BigInteger TW=BigInteger.ONE.add(BigInteger.ONE);// 大数 2
while(!b.equals(BigInteger.ZERO))//如果b != 0 进入循环
{
if(b.remainder(TW).equals(BigInteger.ONE)) // 如果该位==1,则ans=ans*a;
ans = (ans.multiply(a)).remainder(c);//
b=b.divide(TW);// 为了下一步计算b二进制的下一位
a = (a.multiply(a)).remainder(c);// a*a 相当于A * A 或者 A^2 * A^2 等等
}
return ans;//返回
} public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
BigInteger a,b,c;
while(input.hasNext()){
a=input.nextBigInteger();
b=input.nextBigInteger();
c=input.nextBigInteger();
System.out.println(POW(a,b,c));
} } }

总结

不做不知道,一做吓一跳,水平太低了,要好好练习了。

欢迎大家指正。

Java大数——快速矩阵幂的更多相关文章

  1. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  2. HDU - 6395 Sequence (分块+快速矩阵幂)

    给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...

  3. HDU----(4291)A Short problem(快速矩阵幂)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  5. HDU----(2157)How many ways??(快速矩阵幂)

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. Matrix Power Series(POJ 3233 构造新矩阵求解+ 快速矩阵幂)

    题目大意:给定A,k,m(取模),求解S = A + A2 + A3 + … + Ak. 思路:此题为求解幂的和,一开始直接一个个乘,TLE.时间消耗在累加上.此处巧妙构造新矩阵 p=    A 0 ...

  7. Tr A(HDU 1575 快速矩阵幂模板)

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. POJ 3070 - 快速矩阵幂求斐波纳契数列

    这题并不复杂. 设$A=\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}$ 由题中公式: $\begin{pmatrix}f(n+1) & ...

  9. 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;记忆化递归

    HDU 4911 Inversion 考点:归并排序 思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了.然后不会做-- 由于看到题上说是相邻的两个数才干交换的时候.感觉 ...

随机推荐

  1. php判断是否为时间戳

       判断值是否为时间戳 function is_timestamp($timestamp) { if(strtotime(date('m-d-Y H:i:s',$timestamp)) === $t ...

  2. JavaWeb基础—VerifyCode源码

    package com.jiangbei.verifycodeutils; import java.awt.BasicStroke; import java.awt.Color; import jav ...

  3. hashMap put的返回值测试

    @Testpublic void findOne() throws Exception { HashMap<Integer,Integer> hashMap = new HashMap&l ...

  4. imu标定 imu_tk

    1. 首先标定加速度计,这是imu加速度计xyz三个轴在标定过程中的读数: 标定结果: 2. 利用加速度计的标定结果,标定陀螺仪,结果: 也可以使用港科大开源的一个工具: https://github ...

  5. cogs468 [NOI2010]超级钢琴

    http://cogs.pro:8080/cogs/problem/problem.php?pid=468 emmmmmm 今天考试爆炸顺便切了这题 这题我肯定不会啦然后看一sol.. 固定一个右端点 ...

  6. Python语言简介以及特点

    编程语言的分为编译型语言和解释型语言: 1. 编译型语言: (1) 编译型语言的代表:C.C++.Delphi等, (2) 编译型语言的运行方式:编译 -> 运行 (3) 编译型语言的优缺点分析 ...

  7. 图片转换成word 公式

    1 下载安装mathpix, 利用该软件将图片转换成LaTeX公式 2 参考此帖,将LaTeX公式转换成word公式 https://www.douban.com/note/648629593/ ht ...

  8. C语言操作符学习总结

    c语言中关于操作符部分的学习,可以主要分为两个部分:操作符和表达式. 这里首先是列举各种操作符,在C语言中,一般主要的操作符有这么几种:算数操作符,移位操作符,位操作符,赋值操作符,单目运算符,关系操 ...

  9. APP性能测试--功耗测试

    一.功耗测试基础 移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要.另外,android的很多特性都比较耗电(如屏幕,GPS,sensor传感器,唤醒机制,CPU,连网等的使用),我们必须要 ...

  10. 特效Shader对雾的处理

    RFX4_Particle.shader案例 #ifdef BlendAdd UNITY_APPLY_FOG_COLOR(i.fogCoord, res, half4(0,0,0,0)); #endi ...