当前位置: 首页 > news >正文

可做题2(矩阵快速幂,乘法逆元,exgcd)

题目链接:可做题2 (nowcoder.com)

题目描述

若一个数列a满足条件an=an-1+an-2,n ≥ 3,而a1,a2为任意实数,则我们称这个数列为广义斐波那契数列。
现在请你求出满足条件a1=i,a2为区间[l,r]中的整数,且ak mod p=m的广义斐波那契数列有多少个。
 

输入描述:

本题包含多组数据,输入第一行包含一个正整数T,表示数据组数。对于每组数据:
一行六个用空格隔开的整数i,l,r,k,p,m,意义如题目描述所示。

输出描述:

输出共T行,每行一个数表示该组数据的答案。

示例1

输入

复制6 2 17 68 3 23 1 1 17 68 3 57 1 5 17 68 10 11 9 5 17 68 10 71 9 10 17 68 11 12 3 10 17 68 8 6 4

6
2 17 68 3 23 1
1 17 68 3 57 1
5 17 68 10 11 9
5 17 68 10 71 9
10 17 68 11 12 3
10 17 68 8 6 4

输出

复制3 1 4 1 5 9

3
1
4
1
5
9

备注:

对于所有数据,0 ≤ l ≤ r,1 ≤ p ≤ 109,0 ≤ m < p,T=10,0 ≤ i ≤ 1018,k ≥ 3。

思路:对于这个题一看斐波那契,数据又很大,应该立马就想到了矩阵快速幂,再接着看akmodp=m,可能又跟扩展欧几里得有关系,由于p可能不是质数,所以需要判断不互质的情况,然后使用扩展欧几里得或欧拉定理求解同余方程。

首先可以发现 ak=f(k-2)+f(k-1)*x;首先利用矩阵快速幂求出ak。可以利用矩阵a[2][2]={1,1,1,0}这样的一个矩阵,然后k次方就行 了,也就是a[2][2]*(a[2][2]^(k-1)),然后算出ak,我们得到f[1][1]和f[2][1],即f(k-1)和f(k-2),然后exgcd解方程 , 每隔p/gcd 个就有一个解

如果l-x>1的话,结果就是:

(r-x)/(p/gcd)+1-(l-x-1)/(p/gcd)+1;

更详细题解:可做题2(Code+12月网络赛)(扩欧+矩阵快速幂)_Coco_T_的博客-CSDN博客

#include<bits/stdc++.h>
#define lmw ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
//int n,m;
const int N=105;
int f[N][N],a[N][N];
// const int mod=1e9+7;
int c[N][N];
int i,l,r,k,pp,m,x,y;
int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int gcd=exgcd(b,a%b,x,y);
	int z=x;
	x=y;
	y=z-(a/b)*y;
	return gcd;
}
void mul(int c[],int a[],int b[][N]){
	int s[N]={0};
	for(int i=0;i<=2;i++){
		for(int j=0;j<=2;j++){
			s[i]=(s[i]+a[j]*b[j][i])%pp;
		}
	}
	memcpy(c,s,sizeof(s));
}
void mul(int c[N][N],int a[N][N]){
	int p[N][N]={0};    
	for(int i=1;i<=2;i++){
		for(int j=1;j<=2;j++){
			for(int k=1;k<=2;k++){
			p[i][j]=(p[i][j]+c[i][k]*a[k][j])%pp;				
			}
		}
	}
	memcpy(a,p,sizeof(p));
}
int cal(int x,int y){
	if(x<y) return 0;
	return (x-y)/pp+1;
}
int solve(int xx,int yy){
	int c=__gcd(xx,pp);
	if(yy%c!=0) return 0;
	xx/=c;
	yy/=c;
	pp/=c;
//	int xx,yy;
	int res=exgcd(xx,pp,x,y);
    x=(x*yy+pp)%pp;
	x=(pp+x%pp)%pp;
	return (int)(cal(r,x)-cal(l-1,x)); 
}
signed main(){
    lmw;
	int t;
	cin>>t;
	while(t--){
        a[1][1]=1,a[1][2]=1;
	    a[2][1]=1,a[2][2]=0;
		cin>>i>>l>>r>>k>>pp>>m;
		i%=pp;
		k-=3;
		f[1][1]=1,f[1][2]=1;
        f[2][1]=1,f[2][2]=0;
		while(k){
			if(k&1) mul(a,f);
			mul(a,a);
			k/=2;
		}
		int ans=f[1][1]%pp;
		int sum=((m-f[2][1]%pp*i%pp)%pp+pp)%pp;
//         cout<<ans<<" "<<sum<<" ";
		cout<<solve(ans,sum)<<"\n";
	}
}

AC代码:

相关文章:

  • Mysql用户权限分配详解
  • 一文7个步骤从0到1教你搭建Selenium 自动化测试环境
  • 【网络安全工程师】从零基础到进阶,看这一篇就够了
  • 【C陷阱与缺陷】----语法陷阱
  • 解忧杂货铺(五续集):用了无法离开的网站资源
  • 功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂
  • iOS 紧急通知
  • 艹,终于在8226上把灯点亮了
  • Linux上用Samba建立共享文件夹并通过Linux测试
  • shell简单使用介绍
  • 关于中级开发工程师常问的面试题
  • 蓝桥杯刷题第二十天
  • 二叉树(数据结构系列9)
  • mybatis-plus的批量新增insertBatchSomeColumn
  • Linux内核IO基础知识与概念
  • jdbc就是这么简单
  • js中forEach回调同异步问题
  • js中的正则表达式入门
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Promise面试题2实现异步串行执行
  • sublime配置文件
  • Vue实战(四)登录/注册页的实现
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 经典排序算法及其 Java 实现
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 老板让我十分钟上手nx-admin
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 让你的分享飞起来——极光推出社会化分享组件
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 Docker 部署 Spring Boot项目
  • 探索 JS 中的模块化
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • (11)MSP430F5529 定时器B
  • (2)Java 简介
  • (2)STL算法之元素计数
  • (3)选择元素——(17)练习(Exercises)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) Face-Resources
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat文件调用java类的main方法
  • .net 提取注释生成API文档 帮助文档
  • .net 无限分类
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET中统一的存储过程调用方法(收藏)
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @RunWith注解作用
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [C++]C++入门--引用