码迷,mamicode.com
首页 > 其他好文 > 详细

scddfcd

时间:2019-06-12 01:20:01      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:second   bit   lld   signed   can   output   puts   friend   cond   

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^‘0‘)
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
    char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch==-)&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+0);}
template<class T>il void ot(T x){if(x<0) putchar(-),x=-x;output(x);putchar( );}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar(\n);}
namespace Modulo{
int mod=1e9+7;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-2){int ret=1;while(y){if(y&1) ret=mul(x,ret);x=mul(x,x);y>>=1;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
using namespace Modulo;
namespace Miracle{
const int N=20;
ll m,n;
ll c;
struct tr{
    ll a[N][N];
    void scan(){
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
          scanf("%lld",&a[i][j]);
    }
    void init(){
        memset(a,0,sizeof a);
    }
    void pre(){
         for(int i=1;i<=n;i++) a[i][i]=1;
    }
    void op(){
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
             printf("%lld ",a[i][j]);
            puts("");
        }
        cout<<endl;
    }
    tr friend operator *(tr a,tr b){
        tr c;c.init();
        // a.op();
        // b.op();
        for(int i=1;i<=n;i++)
         for(int k=1;k<=n;k++)
          for(int j=1;j<=n;j++)
           c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
        
        // c.op();
        return c;
    }
    
}S,A,B,T;
tr qt(tr a,ll y){
    // cout<<" y "<<y<<endl;
    // cout<<" a "<<endl;
    // a.op();
    tr ret;ret.pre();
    tr base;base=a;
    while(y){
        if(y&1) ret=ret*base;
        base=base*base;
        y>>=1;
    }
    return ret;
}
int main(){
    int f1,f2,f3;
    rd(m);rd(f1);rd(f2);rd(f3);rd(c);
    B.init();
    B.a[1][1]=B.a[2][1]=B.a[3][1]=B.a[1][2]=B.a[2][3]=B.a[4][4]=B.a[5][4]=B.a[5][5]=1;
    B.a[4][1]=2;
    S.init();
    S.a[1][4]=1;S.a[1][5]=1;
    
    mod-=1;
    n=5;
    // B.op();
    // S.op();
    T=S*qt(B,m-3);
    // T.op();
    ++mod;
    ll ans=qm(c,T.a[1][1]);
    // cout<<" ans1 "<<ans<<endl;
    S.init();
    B.init();
    n=9;
    B.a[1][1]=B.a[2][1]=B.a[3][1]=B.a[4][4]=B.a[5][4]=B.a[6][4]=B.a[7][7]=B.a[8][7]=B.a[9][7]=1;
    B.a[1][2]=B.a[2][3]=B.a[4][5]=B.a[5][6]=B.a[7][8]=B.a[8][9]=1;
    S.a[1][1]=S.a[1][5]=S.a[1][9]=1;
    --mod;
    T=S*qt(B,m-3);
    // T.op();
    ++mod;
    ans=mul(ans,qm(f1,T.a[1][7]),qm(f2,T.a[1][4]),qm(f3,T.a[1][1]));
    ot(ans);
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
*/

 

scddfcd

标签:second   bit   lld   signed   can   output   puts   friend   cond   

原文地址:https://www.cnblogs.com/Miracevin/p/11006948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!