快速幂 ,快速幂优化,矩形快速幂(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: ...
随机推荐
- Asp.net 项目部署的两个问题
1:关于MVC中BundleCollection压缩js css文件 发布后获取失败的问题 原因是: 默认本地vs里面调试的时候,因为web.config文件里面有一个debug属性,当有此属性时,默 ...
- stringify()和parse()的区别
记录一下小知识点,大神略过... 一:JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"go ...
- idea编译错误提示编译版本不对,需要注意的配置
- day06 字典、元组、set的方法及常用操作
今日内容: 1.深浅拷贝 2.元组 3.字典 4.set 1.深浅拷贝 # 1.值拷贝 # 采用赋值的方法进行 # 只会将堆区容器变量与栈区的绑定关系进行复制 # 2.浅拷贝 # 会将堆区与栈区的绑定 ...
- 跨域资源共享(CORS)
同源策略 同源策略是浏览器的一个安全策略,只允许当前页面或当前域下发送请求,如果向其他域发送请求,会被浏览器拦截 同源的意思:协议.IP地址.端口三者一致,浏览器才会认为是同一个域,三者中有一个不一致 ...
- deepin(debian)下使用Git
Github github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开. 安装git 安装 sudo apt-get install g ...
- spring-cloud-eureka服务注册与发现
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项 ...
- 电脑移动后WIFI连接失败解决方法
1.现象原因 经常会发现将自己的电脑带到不同的地方后连接附近WIFI失败的现象,这是什么原因造成的了,觉得明明之前还有连过这个无线,密码都是正确的,无线连接的图标显示一个大大大的感叹号! 像下面一样 ...
- 2018年最新JAVA面试题总结之基础(1)
转自于:https://zhuanlan.zhihu.com/p/39322967 1.JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗? 回答: 能,Jav ...
- python Request模块
---恢复内容开始--- Request的五种请求方式: request.get() request.post() request.head() requst.put() request.patch( ...