快速幂 ,快速幂优化,矩形快速幂(java)
快速幂形式
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)的更多相关文章
- 【板子】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 ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...
- 怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法
怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法 Windows10系统的"快速访问"功能很容易泄露电脑中的隐私,用什么方法可以让这个功能消失,避免电脑的个人 ...
- ASP.NET Core模块化前后端分离快速开发框架介绍之2、快速创建一个业务模块
源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...
- Serverless 初体验:快速开发与部署一个Hello World(Java版)
昨天被阿里云的这个酷炫大屏吸引了! 我等85后开发者居然这么少!挺好奇到底什么鬼东西都是90.95后在玩?就深入看了一下. 这是一个关于Serverless的体验活动,Serverless在国内一直都 ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13488 Accepted: ...
随机推荐
- ES7的async/await
async 表示这是一个async函数,await只能用在这个函数里面. await 表示在这里等待promise返回结果了,再继续执行. await 后面跟着的应该是一个promise对象 awai ...
- A Discriminative Feature Learning Approach for Deep Face Recognition
url: https://kpzhang93.github.io/papers/eccv2016.pdf year: ECCV2016 abstract 对于人脸识别任务来说, 网络学习到的特征具有判 ...
- SSH整合 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 07binlog日志介绍
设置日志格式为row 创建数据库和表 mysql> create database chinasoft charset=utf8mb4; mysql> use chinasoft; mys ...
- nginx+uwsgi+django开发环境搭建
Nginx+uWSGI+Djangoi开发环境搭建 Django简介,环境搭建 uWSGI简介,安装与配置 Nginx安装与配置 Nginx+uWSGI+Django原理解析 1.django简介,环 ...
- 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]
传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...
- JAVA第三次实训作业
---恢复内容开始--- 1. 编写“学生”类及其测试类. “学生”类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2:计算平均成绩 ...
- 怎么编辑PDF文件内容,PDF文件编辑方法
怎样编辑PDF文件内容?这是一个常常困扰我们的问题,工作当中我们经常会收到PDF格式的文件,但有时的文件内容不是我们想要的或者是觉得不合理的需要改掉.但是每次有这样的问题时都没有什么好的解决方法,每次 ...
- MySQL 笔记(Mysql 8.0.16)
用户登陆 mysql -u user_name -p 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; 关闭服务 D:\ ...
- Python 实现auto linlink 连连看
先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...