题意:求出代码中的值。
思路:两种:第一种打表发现fi=fi-1+2*fi-2+1
第二种:
//a[n] = a[n-1] + n%2
//a[n] = a[n-1] + (n+1)/2 - n/2
#include <bits/stdc++.h> #include<unordered_map> using namespace std; #define ll long long const int maxn=20; int mod=1e9+7; struct Marix{//矩阵 int mo[maxn][maxn],n; Marix(){} Marix(int _n){ n=_n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) mo[i][j]=0; } } }; Marix mul(Marix a,Marix b){//矩阵乘法 Marix res=Marix(a.n); for(int i=0;i<a.n;i++){ for(int j=0;j<a.n;j++){ for(int k=0;k<a.n;k++){ int tmp=(long long )a.mo[i][k]*b.mo[k][j]%mod; res.mo[i][j]=(res.mo[i][j]+tmp)%mod; } } } return res; } Marix powMod(Marix a,int n){//矩阵快速幂 Marix nul; nul=Marix(a.n); for(int i=0;i<nul.n;i++){ nul.mo[i][i]=1; } while(n){ if(n&1) nul=mul(nul,a); a=mul(a,a); n>>=1; } return nul; } int main() { int n,m; while(~scanf("%d%d",&n,&mod)) { Marix t1=Marix(3); t1.mo[0][0]=1; t1.mo[0][1]=0; t1.mo[0][2]=1; Marix t=Marix(3); t.mo[0][0]=1; t.mo[1][0]=2; t.mo[2][0]=1; t.mo[0][1]=1; t.mo[2][2]=1; Marix ans1=powMod(t,n-1); Marix ans=mul(t1,ans1); printf("%d\n",ans.mo[0][0]); } }