CODEVS1281 Xn数列

Posted ONION_CYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEVS1281 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

 

以上是关于CODEVS1281 Xn数列的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1281 Xn数列

Xn数列(codevs 1281)

codevs1281 Xn数列

codevs 1281 Xn数列 (矩阵乘法)

C++之路进阶——矩阵乘法(Xn数列)

codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数