【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

2024-08-27 02:48

本文主要是介绍【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目链接】click here~~

【题目大意】

Jzzhu has invented a kind of sequences, they meet the following property:

You are given x and y, please calculate fn modulo1000000007(109 + 7).

【解题思路】

solution one:

/*A - Jzzhu and Sequences
Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )
给定f1和f2,求fn
分析:
特判f1,f2
当n>=3时使用矩阵快速幂即可
将公式转化一下 , 可以得到一个变换矩阵
由F(i)=F(i-1)+F(i+1);
 将左式移到右边得
  F(i+i)=F(i)-F(i-1);
下标同时减一得
  F(i)=F(i-1)-F(i-2);
从而构造矩阵
(F(i-1),F(i-2))*[1 -1 ]=(F(i),F(i-1))
                [1  0 ]
带入i=3,得
(F(2)=y,F(1)=x)*[1 -1 ]^(i-2)=(F(3),F(2))
                [1  0 ]
代码如下*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const long long  MOD=1e9+7;
#define LL long long
struct Matrlc
{long long  mapp[2][2];
} ans,base;
Matrlc unit={1,0,0,1};
Matrlc mult(Matrlc a,Matrlc b)
{Matrlc c;for(int i=0; i<2; i++)for(int j=0; j<2; j++){c.mapp[i][j]=0;for(int k=0; k<2; k++)c.mapp[i][j]+=(a.mapp[i][k]*b.mapp[k][j])%MOD;c.mapp[i][j]%=MOD;}return c;
}
void pow1(LL n)
{base.mapp[0][0] =1;base.mapp[0][1] = -1;base.mapp[1][0] = 1;base.mapp[1][1] = 0;ans.mapp[0][0] = ans.mapp[1][1] = 1;// ans 初始化为单位矩阵ans.mapp[0][1] = ans.mapp[1][0] = 0;while(n){if(n&1)   ans=mult(ans,base);base=mult(base,base);n>>=1;}
}
int main()
{LL X,Y,N,i,j;scanf("%lld%lld%lld",&X,&Y,&N);if(N==1) printf("%lld\n",(X%MOD+MOD)%MOD);else if(N==2) printf("%lld\n",(Y%MOD+MOD)%MOD);else{pow1(N-2);LL  result=(((ans.mapp[0][0]*Y+ans.mapp[0][1]*X)%MOD)+MOD)%MOD;printf("%lld\n",result);}return 0;
}

solution two:

【思路】对于转化的公式。我们通过前六项发现循环节

故而可以用循环节暴力解决即可了

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;typedef long long LL;
const LL mod=1e9+7;
LL a[10];
int main()
{LL x,y,n;while(~scanf("%lld%lld%lld",&x,&y,&n)){a[0]=x;a[1]=y;if(a[0]<0) a[0]+=mod;if(a[1]<0) a[1]+=mod;for(int i=2; i<=5; ++i){a[i]=a[i-1]-a[i-2];if(a[i]<0) a[i]+=mod;else if(a[i]>=mod) a[i]-=mod;}printf("%lld\n",a[(n-1)%6]);} return 0;
}


这篇关于【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110420

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +