HDU 6198 矩阵快速幂

来源:互联网 发布:ruby python nodejs 编辑:程序博客网 时间:2024/06/05 15:47

ans=F(2*i+3)-1

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=100005;const ll mod=998244353;const int maxm=2;typedef struct Node{int f[maxm][maxm];Node(int a=0,int b=0,int c=0,int d=0){f[0][0]=a,f[0][1]=b;f[1][0]=c,f[1][1]=d;}Node operator + (const Node &x) const{Node ans;for(int i=0;i<maxm;i++){for(int j=0;j<maxm;j++){ans.f[i][j]=(f[i][j]+x.f[i][j])%mod;}}return ans;}Node operator * (const Node &x) const{Node ans;for(int i=0;i<maxm;i++){for(int j=0;j<maxm;j++){ll temp=0;for(int k=0;k<maxm;k++){temp=(temp+((f[i][k]%mod)*(x.f[k][j]%mod)%mod))%mod;}ans.f[i][j]=temp;}}return ans;}Node operator % (const ll &mod){for(int i=0;i<maxm;i++){for(int j=0;j<maxm;j++){f[i][j]%=mod;}}return *this;}}node;node quick_pow(node a,ll b,ll mod){node ans(1,0,1,0);while(b){if(b&1LL){ans=(ans*a)%mod;}a=(a*a)%mod;b>>=1;}return ans;}int main(int argc, char const *argv[]){ios::sync_with_stdio(false);ll n;node temp(1,1,1,0);while(cin>>n){node ans=quick_pow(temp,2*n+2,mod);cout<<(ans.f[0][0]-1+mod)%mod<<endl;}return 0;}


原创粉丝点击