首页 > 其他分享 >51nod 1365 Fib(N) mod Fib(K)-题解

51nod 1365 Fib(N) mod Fib(K)-题解

时间:2023-05-07 20:44:06浏览次数:39  
标签:res Matrix 51nod 题解 ll Fib ans mod

51nod 1365 Fib(N) mod Fib(K)

个人评价:考一些奇奇怪怪的知识点呢

算法

矩阵快速幂、斐波那契公式

题面

求\(F_n\%F_k\)的值,\(1\leq n,k\leq 1e18\)

问题分析

我一开始居然想着直接矩阵快速幂求出两个值算,我也是真的牛……

我们要知道这些斐波那契公式(考的真怪)

\[F_{-n}=(-1)^{n-1}F_n \]

\[F_n=F_kF_{n-k+1}+F_{k-1}F_{n-k} \]

\[F_{k-1}^2+F_{k-1}F_k-F_k^2=(-1)^k \]

问题求的是\(F_n \% F_k\)的值,所以我们考虑所有计算推导相等在模\(F_k\)下进行

开始娱乐地推式子了

\[\begin{aligned} F_n&=F_kF_{n-k+1}+F_{k-1}F_{n-k} \\ &=F_{k-1}F_{n-k}\\ &=F_{k-1}(F_kF_{n-2k+1}+F_{k-1}F_{n-2k})\\ &=F_{k-1}^2F_{n-2k}\\ \end{aligned} \]

所以可以得到\(F_n=F_{k-1}^{\lfloor\frac{n}{k}\rfloor}F_{n\%k}\)

看到最后一个公式,我们也在模\(F_k\)意义下推导

\[\begin{aligned} (-1)^k&=F_{k-1}^2+F_{k-1}F_k-F_k^2 \\ &=F_{k-1}^2\\ \end{aligned} \]

令\(\lfloor\frac{n}{k}\rfloor=i,n\%k=j\) 考虑将这个带入到\(F_n\)的式子,然后进行分类讨论:

  1. 当i&1=0:\(F_n=(-1)^{k\times \frac{i}{2}}F_j\)
  2. 当i&1=1:\(F_n=F_{k-1}^iF_j=F_{k-1}^i(F_{k-1}F_{j-k}+F_kF_{j-k+1})=F_{k-1}^{i+1}F_{j-k}=(-1)^{\frac{i+1}{2}k+k-j-1}F_{k-j}\)

代码实现

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1e9+7;
struct Matrix{
	ll x[10][10];
};
Matrix mul(Matrix a,Matrix b){
	Matrix res;
	memset(res.x,0,sizeof res.x);
	for(ll i=0;i<2;i++){
		for(ll j=0;j<2;j++){
			for(ll k=0;k<2;k++){
				res.x[i][j]=(res.x[i][j]+a.x[i][k]*b.x[k][j]%p)%p;
			}
		}
	}
	return res;
}
ll qpow(Matrix a,ll k){
	Matrix res;
	memset(res.x,0,sizeof res.x);
	for(ll i=0;i<2;i++)res.x[i][i]=1;
	while(k){
		if(k&1)res=mul(res,a);
		a=mul(a,a);
		k>>=1;
	}
	return res.x[0][0]%p;
}

void solve(){
	ll n,k;
	Matrix a;
	memset(a.x,0,sizeof a.x);
	a.x[0][0]=a.x[0][1]=a.x[1][0]=1;
	scanf("%lld%lld",&n,&k);
	ll i=n/k,j=n%k;
	ll ans=0,mod=qpow(a,k-1);
	if(i%2==0){
		if(j==k)ans=0;
		else ans=qpow(a,j-1);
		if(k%2==1)ans=-ans;
		if(ans<0)ans=(ans+mod);
		ans=(ans+p)%p;
	}else{
		if(j==0)ans=0;
		else ans=qpow(a,k-j-1);
		if((k-j-1)%2==1)ans=-ans;
		if(ans<0)ans=(ans+mod);
		ans=(ans+p)%p;
	}
	printf("%lld\n",(ans+p)%p);
}
int main(){
	ll T;
	scanf("%lld",&T);
	while(T--)solve();


	return 0;
}

总结

这个考的东西真的很奇怪,也算是我的积累问题吧,毕竟斐波那契我就只知道那两个通项公式,还是得多做点题

标签:res,Matrix,51nod,题解,ll,Fib,ans,mod
From: https://www.cnblogs.com/Zhangrx-/p/17380108.html

相关文章

  • 2023ccpc湖北省赛/2023 Hubei Provincial Collegiate Programming Contest个人题解
    2023HubeiProvincialCollegiateProgrammingContestAPrimeMagicWalkAlonehasasequence\(a_1,a_2,...,a_n\),andhecanuseamagiconit:Chooseanoddprimenumber\(p\)andaninterval\([l,r]⊆[1,n]\)satisfying\(r−l+1=p\),andthenadd......
  • MultiDex使用方法及由此导致的crash、ANR问题解决方案
    Android开发的朋友,如果是在开发一款中大型应用时,都会碰到这么一个问题,就是dex分拆问题,google给出的解决方案MultiDex。现象:有些APP本身功能比较多,再加上一些其它三方的SDK,慢慢的发现dex越来越大,直到有一天编译出现如下错误:Error:Thenumberofmethodreferencesina.dexfile......
  • 十二代酷睿处理器N100 N200 N305 等安装ESXI紫屏问题解决办法
    12代大小核紫屏报错解决方案四部曲1、安装界面倒计时结束之前,按SHIFT+O,在原有命令后面加空格后输入以下代码cpuUniformityHardCheckPanic=FALSE2、安装完ESXI之后会重启,在重启界面倒计时结束前,再操作一次,按住SHIFT+O,输入cpuUniformityHardCheckPanic=FALSE3、进入ESXI把SSH功能......
  • 力扣《环形链表Ⅱ》超详细题解
    作为经典题目的《环形链表Ⅱ》,我认为这题还是有专门出一期博客的分量的,大家也可以自己事先按照自己的理解写一写,然后再来看题解,毕竟自己悟出来的东西是比吸收别人的来的更深刻。一、题目给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。......
  • CF1829B 题解
    题目思路先定义变量\(t,ans\)。循环从\(0\)到\(n-1\),对于第\(i\)个数,如果为\(0\),\(t=t+1\),否则将\(t\)清零。每次循环\(ans=\max(ans,t)\)表示最多有多少个连续的\(0\)。最后输出\(ans\)即可。核心代码点击查看代码voidsolve(){intn=read(),a[1005],a......
  • AtCoder Regular Contest 159简要题解
    AtCoderRegularContest159传送门A-CopyandPasteGraph图的邻接矩阵为\[\left(\begin{matrix}A&A&\cdots&A\\A&A&\cdots&A\\\cdots&\cdots&\cdots&\cdots\\A&A&\cdots&A\e......
  • P8655 [蓝桥杯 2017 国 B] 发现环 题解
    题目概述题目传送门在一棵树中新增一条边,使得这个图产生一个环,求在环上的点。思路:拓补排序对于这道题显然不能生搬硬套拓补排序的模板。这道题中的图是一个无向图,而拓补排序却是处理有向图的一种思想。不难想到可以将无向图转化为有向图,即将对于每条无向边变换为双向建边,就......
  • ABC297F 题解
    容斥萌萌题给你一个\(H\timesW\)的棋盘,问在棋盘上随机撒\(k\)个点,能够围住这\(k\)个点的最小子矩形的期望面积考虑枚举子矩形可以直接转成计数问题转变为在\(n\timesm\)的矩形中撒\(k\)个点,有多少种方案使得四条边上均至少有一个点答案乘上矩形面积再除以所有撒点......
  • Mac M系列芯片 vue前端node-sass兼容问题解决
    0、由于M系列芯片是arm架构,在使用brew安装node时都是arm的node,但是[email protected]版本中不支持arm架构的出现如下报错:Error:NodeSassdoesnotyetsupportyourcurrentenvironment:OSXUnsupportedarchitecture(arm64)withUnsupportedruntime(88)Formoreinfor......
  • LVJR2 赛后题解
    赛后补题请到洛谷比赛。A考虑分类讨论。显然当\(a=0,b=0\)时,答案等于\(0\)。当\(a=0\)或\(b=0\)时,直接将等于\(0\)的数乘以一个很大的数字,将不等于零的数除以一个很大的数字,答案为\(v\)。当\(a,b\)均不为\(0\)时,可以选择先将一个数字减到\(0\),或将一个数字除......