快速幂形式

public static int f(int a,int b,int c){
int ans =1;
int base=a;
while(b!=0){
if((b&1)!=0)
ans=(ans*base)%c;
base=(base*base)%c;
}
return ans;
}

快速乘法幂(优化)

幂转换成乘法,乘法转化成加法

 public static int f(int a,int b,int c){
int ans = 0;
int base=a;
while(b!=0){
if((b&1)!=0)
ans=(ans+base)%c;
base=(base+base)%c;
b>>=1;
}
return ans;
}
public static int f1(int a,int b,int c){
int ans =1;
int base = a;
while(b!=0){
if((b&1)!=0)
ans= f(ans, base, c);
base=f(base, base, c);
b>>=1;
}
return ans;
}

矩阵快速幂

将快速幂里边的1换成一个单位矩阵,然后利用矩阵相乘。

public static long[][] mut(int k,int n,long[][]A){
long [][]res = new long[n][n];
for(int i=0;i<res.length;i++)
res[i][i]=1;
while(k!=0){
if((k&1)!=0)
res=f(res,A);
A=f(A,A);
k>>=1;
}
return res;
}
public static long[][] f(long[][]A,long[][] B){
long res[][]=new long[A.length][B.length];
for(int i=0;i<res.length;i++)
for(int j=0;j<res[0].length;j++){
for(int k=0;k<B.length;k++){
res[i][j]+=A[i][k]*B[k][j];
}
}
return res;
}

例题:蓝桥杯 --加强的斐波那契

斐波那契数列大家都非常熟悉。它的定义是:

  f(x)  =  1  ....  (x=1,2) 
  f(x)  =  f(x-1)  +  f(x-2)  ....  (x> 2)

  对于给定的整数  n  和  m,我们希望求出: 
  f(1)  +  f(2)  +  ...  +  f(n)  的值。但这个值可能非常大,所以我们把它对  f(m)  取模。

import java.util.*;

public class Main8 {   //基本上是按模板写的

    public static long[][] mut(int k,int n,long[][]A){
long [][]res = new long[n][n];
res[1][1]=1;
res[1][0]=0;
res[0][1]=0;
res[0][0]=1;
while(k!=0){
if((k&1)!=0)
res=f(res,A);
A=f(A,A);
k>>=1;
}
return res;
}
public static long[][] f(long[][]A,long[][] B){
long res[][]=new long[A.length][B.length];
for(int i=0;i<res.length;i++)
for(int j=0;j<res[0].length;j++){
for(int k=0;k<B.length;k++){
res[i][j]+=A[i][k]*B[k][j];
}
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long a[][]=new long [2][2];
a[0][0]=1;
a[1][1]=0;
a[0][1]=1;
a[1][0]=1;
long d[][]=mut(n-1,2,a );
System.out.println(d[0][0]%1000000009); }
}

快速幂 ,快速幂优化,矩形快速幂(java)的更多相关文章

  1. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数

    1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...

  2. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  3. 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush

    「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员‍,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...

  4. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

    4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...

  5. 怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法

    怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法 Windows10系统的"快速访问"功能很容易泄露电脑中的隐私,用什么方法可以让这个功能消失,避免电脑的个人 ...

  6. ASP.NET Core模块化前后端分离快速开发框架介绍之2、快速创建一个业务模块

    源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...

  7. Serverless 初体验:快速开发与部署一个Hello World(Java版)

    昨天被阿里云的这个酷炫大屏吸引了! 我等85后开发者居然这么少!挺好奇到底什么鬼东西都是90.95后在玩?就深入看了一下. 这是一个关于Serverless的体验活动,Serverless在国内一直都 ...

  8. poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

    题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...

  9. POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13488   Accepted:  ...

随机推荐

  1. ES7的async/await

    async 表示这是一个async函数,await只能用在这个函数里面. await 表示在这里等待promise返回结果了,再继续执行. await 后面跟着的应该是一个promise对象 awai ...

  2. A Discriminative Feature Learning Approach for Deep Face Recognition

    url: https://kpzhang93.github.io/papers/eccv2016.pdf year: ECCV2016 abstract 对于人脸识别任务来说, 网络学习到的特征具有判 ...

  3. SSH整合 pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 07binlog日志介绍

    设置日志格式为row 创建数据库和表 mysql> create database chinasoft charset=utf8mb4; mysql> use chinasoft; mys ...

  5. nginx+uwsgi+django开发环境搭建

    Nginx+uWSGI+Djangoi开发环境搭建 Django简介,环境搭建 uWSGI简介,安装与配置 Nginx安装与配置 Nginx+uWSGI+Django原理解析 1.django简介,环 ...

  6. 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]

    传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...

  7. JAVA第三次实训作业

    ---恢复内容开始--- 1. 编写“学生”类及其测试类. “学生”类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2:计算平均成绩 ...

  8. 怎么编辑PDF文件内容,PDF文件编辑方法

    怎样编辑PDF文件内容?这是一个常常困扰我们的问题,工作当中我们经常会收到PDF格式的文件,但有时的文件内容不是我们想要的或者是觉得不合理的需要改掉.但是每次有这样的问题时都没有什么好的解决方法,每次 ...

  9. MySQL 笔记(Mysql 8.0.16)

    用户登陆 mysql -u user_name -p 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; 关闭服务 D:\ ...

  10. Python 实现auto linlink 连连看

    先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...