2019牛客暑期多校训练营(第五场)generator 1

  • generator 1
    思路就是用十进制的快速幂就行了,在榜首找到大佬的矩阵快速幂板子,大佬的板子又短又强,感觉我以前的板子好笨重。新板子写来很简洁,一般不容易写错,存一波模板。
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define ll long long
using namespace std;
int mod;
const int N=2;
struct matrix{
    int a[N][N];
    friend matrix operator*(const matrix&a,const matrix&b)
    {
        matrix c;memset(c.a,0,sizeof(c.a));
        rep(i,N)rep(k,N)rep(j,N)c.a[i][j]=(c.a[i][j]+1ll*a.a[i][k]*b.a[k][j])%mod;
        return c;
    }//定义矩阵乘法
    void pre(){
        memset(a,0,sizeof(a)); 
        for(int i=0;i<N;i++)a[i][i]=1;
    }//初始化单位矩阵
};
 
matrix fp(matrix x,int y){
    matrix ret;
    ret.pre();
    while(y){
        if(y&1)ret=ret*x;
        x=x*x;
        y/=2;  
    }
    return ret;
}//矩阵快速幂 
 
char s[1000100];
int main(){
    matrix rela,ret;
    ios::sync_with_stdio(false);
    int len,x0,x1,ax,bx;
    cin>>x0>>x1>>rela.a[0][0]>>rela.a[0][1]>>s>>mod;
    rela.a[1][0]=1,rela.a[1][1]=0;
    
    len=strlen(s);
    ret.pre(); 
    for(int i=len-1;i>=0;i--){
        ret=ret*fp(rela,s[i]-'0');
        rela=fp(rela,10);
	}  
    ll ans=(1ll*x1*ret.a[1][0]+1ll*x0*ret.a[1][1])%mod;
    cout<<ans<<endl;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值