zoukankan      html  css  js  c++  java
  • [题解]luogu_P5059(矩乘

    这题竟然和5004 m=1时几乎一样.....

    先不考虑至少放两个,方案数和那题一样,再减掉不放和放一个的,共n+1种(把棋子放在格子中n为格子数

    矩乘斐波那契

    不开longlong见祖宗

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=1e18+9;
    ll n,mod;
    ll mul(ll a,ll b){
        ll ans=0;
        while(b){
            if(b&1)ans=(ans+a)%mod;
            a=(a<<1)%mod;
            b>>=1;
        }
        return ans%mod;
    }
    struct node{
        ll a[5][5];
        node(){memset(a,0,sizeof(a));}
        node operator *(const node&t)const{
            node ans;
            for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
            for(int k=1;k<=2;k++)
            (ans.a[i][j]+=mul(a[i][k],t.a[k][j]))%=mod;
            return ans;
        }
    }ans,p;
    node operator ^(node x,ll b){
        node ans;
        ans.a[1][1]=1;ans.a[2][2]=1;
        while(b){
            if(b&1)ans=ans*x;
            x=x*x;
            b>>=1;
        }
        return ans;
    }
    ll qpow(ll a,ll b){
        ll ans=1;
        while(b){
            if(b&1)ans=mul(ans,a);
            a=mul(a,a);
            b>>=1;
        }
        return ans;
    }
    int main(){
        scanf("%lld%lld",&n,&mod);n++;
        if(n<=3){
            if(n==1)cout<<0;
            if(n==2)cout<<0;
            if(n==3)cout<<1;
            return 0;
        }
        ans.a[1][1]=1;ans.a[1][2]=1;
        p.a[1][1]=1;p.a[1][2]=1;p.a[2][1]=1;
        p=p^(n);ans=ans*p;
        ll aa=((ans.a[1][1]-n-1)%mod+mod)%mod;
        aa=qpow(aa,n);
        printf("%lld",aa%mod);
        
    }
  • 相关阅读:
    Hit Event 击中碰撞
    基于ReentrantLock通知唤醒的生产消费模式
    spring 源码构建
    读写分离、分库、分表
    python 反射的使用
    基础算法
    git 命令使用
    java设计模式应用
    linux 中python的使用
    linux命令
  • 原文地址:https://www.cnblogs.com/superminivan/p/11598985.html
Copyright © 2011-2022 走看看