首页 > 其他 > 详细

generator 1

时间:2019-08-01 18:46:13      阅读:54      评论:0      收藏:0      [点我收藏+]

generator 1

十进制快速幂

 

#include<bits/stdc++.h>
using namespace std;
#define Long long long
Long C[2][2],A[2][2],B[2][2];
Long x0,x1,a,b,n,mod,mod1;
void mul(Long A[2][2],Long B[2][2])
{
  
    C[0][0]=(A[0][0]*B[0][0]%mod+A[0][1]*B[1][0]%mod)%mod;
    C[0][1]=(A[0][0]*B[0][1]%mod+A[0][1]*B[1][1]%mod)%mod;
    C[1][0]=(A[1][0]*B[0][0]%mod+A[1][1]*B[1][0]%mod)%mod;
    C[1][1]=(A[1][0]*B[0][1]%mod+A[1][1]*B[1][1]%mod)%mod;
    A[0][0]=C[0][0];
    A[0][1]=C[0][1];
    A[1][0]=C[1][0];
    A[1][1]=C[1][1];
}
char s[2000004];
Long qp()
{
    Long ans[2][2]= {{1,0},{0,1}};
    Long t[2][2]= {{1,0},{0,1}};
    int n=strlen(s);
    int j=n-1;
    while(s[j]==0&&j>=0)
    {
        j--;
  
    }
    s[j]=s[j]-1;
    j++;
    while(j<n){s[j]=9;j++;}
    for(int i=n-1; i>=0; i--)
    {
  
        for(int j=1; j<=10; j++)
        {
            mul(t,A);
            if(j==s[i]-0)
            {
                mul(ans,t);
            }
        }
        A[0][0]=t[0][0];
        A[0][1]=t[0][1];
        A[1][1]=t[1][1];
        A[1][0]=t[1][0];
        t[0][0]=1;
        t[0][1]=0;
        t[1][1]=1;
        t[1][0]=0;
          
    }
    return (ans[0][0]%mod*x1%mod+ans[0][1]%mod*x0%mod)%mod;
}
  
int main()
{
    scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b);
    scanf("%s",s);
    scanf("%lld",&mod);
    // mod1=phi(mod);
    A[0][0]=a;
    A[0][1]=b;
    A[1][0]=1;
    A[1][1]=0;
    if(strcmp(s,"0")==0)cout<<x0<<\n;
    else
    {
        cout<<qp()<<\n;
    }
}

 

generator 1

原文:https://www.cnblogs.com/liulex/p/11284493.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!