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

generator 1

时间:2019-08-01 18:50:41      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:tps   ace   ref   style   while   bit   coder   har   lse   

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

标签:tps   ace   ref   style   while   bit   coder   har   lse   

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

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