bzoj 3240 矩阵游戏

推出f[i][m]和f[i][1]关系式,就能知道f[i][j]和f[i-1][j]的关系式。求出f[n+1][1],-d 再/c即可

注意等比数列等于1的情况

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md 1000000007
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 1000010
using namespace std; 
char st1[N],st2[N]; 
struct arr{ll a1,a0;}n,m;  
ll a,b,c,d,p,k,t; 
arr get(char s[]) 

 arr n; n.a0=n.a1=0;
    int p=strlen(s); 
    for (int i=0;i<p;++i) 
    { 
        n.a1=(n.a1*10+s[i]-48)%md;    
        n.a0=(n.a0*10+s[i]-48)%(md-1); 
    } 
    return n;

ll mi(ll x,ll y)           

    ll ans=1; 
    while (y) 
    { 
      if (y&1) ans=ans*x%md; 
       y>>=1; x=x*x%md; 
    } 
    return ans; 

ll ni(ll x) 

  return mi(x,md-2); 

  
int main() 

    scanf("%s%s",st1,st2); 
    scanf("%lld%lld%lld%lld",&a,&b,&c,&d); 
    n=get(st1); m=get(st2); 
    if (a==1) 
    { 
        b=((m.a1-1)*b%md*c+d)%md; 
        a=c; 
    } 
    else 
    { 
        k=b*ni(a-1)%md;
        t=mi(a,m.a0-1); 
        a=c*t%md; 
        b=((t-1)*k%md*c+d)%md; 
    } 
    if (a==1) 
    { 
        p=(1+n.a1*b)%md; 
    } 
    else 
    { 
        k=b*ni(a-1)%md; 
        t=mi(a,n.a0); 
        p=(t+(t-1)*k)%md;                    
    } 
    printf("%lld",((p-d)*ni(c)%md+md)%md);   
    return 0; 
}


你可能感兴趣的:(bzoj 3240 矩阵游戏)