generator 1

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';
    }
}

猜你喜欢

转载自www.cnblogs.com/liulex/p/11284493.html
今日推荐