【CODEVS】1281 Xn数列

【算法】矩阵快速幂

【题解】T*A(n-1)=A(n)矩阵如下:

a 1 * x(n-1) 0 = xn 0

0 1    c        0    c   0

防止溢出可以用类似快速幂的快速乘。

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll MOD,A,c,x0,n,g,a[2][2],b[2][2],t[2][2];
ll mull(ll x,ll y)
{
    ll ans=0;
    while(y>0)
     {
         if(y&1)ans=(ans+x)%MOD;
         x=(x<<1)%MOD;//x+x
        y>>=1; 
     }
    return ans;
}
void mul(ll a[2][2],ll b[2][2],ll ans[2][2])
{
    for(int i=0;i<2;i++)
     for(int j=0;j<2;j++)
      {
          t[i][j]=0;
          for(int k=0;k<2;k++)
           t[i][j]=(t[i][j]+mull(a[i][k],b[k][j]))%MOD;
      }
    for(int i=0;i<2;i++)
     for(int j=0;j<2;j++)
      ans[i][j]=t[i][j];
}
int main()
{
    scanf("%lld%lld%lld%lld%lld%lld",&MOD,&A,&c,&x0,&n,&g);
    a[0][0]=A,a[0][1]=a[1][1]=1,a[1][0]=0;
    b[0][0]=x0,b[1][0]=c,b[0][1]=b[1][1]=0;
    while(n>0)
     {
         if(n&1)mul(a,b,b);
         n>>=1;
         mul(a,a,a);
     }
    printf("%lld",b[0][0]%g);
    return 0;
}
View Code

 

posted @ 2017-03-09 22:05  ONION_CYC  阅读(300)  评论(0编辑  收藏  举报