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

【CODEVS】1281 Xn数列

时间:2017-03-09 22:41:09      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:out   span   std   fine   快速   img   gif   images   i++   

【算法】矩阵快速幂

【题解】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

 

【CODEVS】1281 Xn数列

标签:out   span   std   fine   快速   img   gif   images   i++   

原文地址:http://www.cnblogs.com/onioncyc/p/6528164.html

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