题解:P9777 [HUSTFC 2023] Fujisaki 讨厌数学

· · 题解

题意

给出 x+\frac{1}{x}(k)x^n+ \frac{1}{x^n}

思路

首先可以想到递推。

f_i=x^i+ \frac{1}{x^i}

考虑转移。

\begin{aligned} f_i&=x^i+ \frac{1}{x^i}&\\ &=x^i+ \frac{1}{x^i}+x^{i-2}+\frac{1}{x^{i-2}}-(x^{i-2}+\frac{1}{x^{i-2}})&\\ &=(x^{i-1}+\frac{1}{x^{i-1}})(x+\frac{1}{x})-(x^{i-2}+\frac{1}{x^{i-2}})&\\ &=k\times f_{i-1}-f_{i-2} \end{aligned} ### 代码 ```cpp #include<bits/stdc++.h> #define int long long using namespace std; int m,k,n; struct mat{ int a[3][3]; void build(){ for(int i=1;i<=2;++i) for(int j=1;j<=2;++j) a[i][j]=0; } mat operator*(const mat x)const{ mat res; res.build(); for(int i=1;i<=2;++i){ for(int j=1;j<=2;++j){ for(int p=1;p<=2;++p){ res.a[i][j]+=a[i][p]*x.a[p][j]%m; res.a[i][j]%=m; } } } return res; } }; signed main(){ cin>>m>>k>>n; if(n==1){ cout<<k; return 0; } if(n==0){ cout<<2; return 0; } mat x; x.a[1][1]=0,x.a[1][2]=-1; x.a[2][1]=1,x.a[2][2]=k; mat res; res.build(); res.a[1][1]=res.a[2][2]=1; --n; while(n){ if(n&1) res=res*x; x=x*x; n>>=1; } cout<<((2*res.a[1][2]+k*res.a[2][2])%m+m)%m; } ```