mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-08-21 18:52:07 +00:00
update
This commit is contained in:
parent
321c58cc95
commit
3e421f198c
51
src/8/19/P1962.cpp
Normal file
51
src/8/19/P1962.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using ll = int64_t;
|
||||||
|
|
||||||
|
const ll M = 1e9+7;
|
||||||
|
|
||||||
|
struct M22{
|
||||||
|
std::vector<std::vector<ll>> v{2,std::vector<ll>(2)};
|
||||||
|
M22 operator*(const M22&o){
|
||||||
|
M22 n;
|
||||||
|
n.v[0][0]=(v[0][0]*o.v[0][0]%M+v[0][1]*o.v[1][0]%M)%M;
|
||||||
|
n.v[0][1]=(v[0][0]*o.v[0][1]%M+v[0][1]*o.v[1][1]%M)%M;
|
||||||
|
n.v[1][0]=(v[1][0]*o.v[0][0]%M+v[1][1]*o.v[1][0]%M)%M;
|
||||||
|
n.v[1][1]=(v[1][0]*o.v[0][1]%M+v[1][1]*o.v[1][1]%M)%M;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
M22&operator*=(const M22&o){
|
||||||
|
*this= *this * o;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
M22 fpow(M22 b,ll e){
|
||||||
|
M22 res;
|
||||||
|
res.v[0][0]=res.v[1][1]=1;
|
||||||
|
while(e){
|
||||||
|
if(e&1){
|
||||||
|
res*=b;
|
||||||
|
}
|
||||||
|
b*=b;
|
||||||
|
e>>=1;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
ll n;
|
||||||
|
std::cin>>n;
|
||||||
|
if(n<=2){
|
||||||
|
std::cout<<1<<'\n';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
n-=2;
|
||||||
|
M22 m{{{1,1},{1,0}}};
|
||||||
|
m=fpow(m, n);
|
||||||
|
std::cout<<
|
||||||
|
(m.v[0][0]+m.v[0][1])%M
|
||||||
|
<<'\n';
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user