Jzzhu and Sequences CodeForces - 450B

首先说下这个题目很善良吧,给了我们负数但又给了我们一个只在0,-1,1之间转的循环matrix.

矩阵自乘:1,-1,1,0 ==>0,-1,1,-1==>-1, 1, -1, 0==>0,-1,1,-1.

看到这我就这知道这个数列会循环。

但同时也告述我们,矩阵快速幂的时候,无需取余。再有题目要求的取余方法与计算机的取余方法不一样,只需按传统方法算完后

再按题目的方法算下就行了。

比如(以模13为列):

        (-8%13+-7%13)%13=(-15)%13=-2(我们常用的算模的方法)这样我们再按题目要求的方式取余得1;

希望自己以后能注意到这点,也希望有路过的大神能指出其中原因。

思路不说了。

AC code:

#include<iostream>
#include<cstdio>
#define debug(k) cout<<k<<endl
using namespace std;
typedef long long LL;
const LL mod=1000000007;
struct matrix{
      int a[2][2];
      matrix (){};
      matrix(int x,int y,int xx,int yy){
          a[0][0]=x,a[0][1]=y,a[1][0]=xx,a[1][1]=yy;
      }
};
LL x,y,k;
matrix mul(matrix a,matrix b)
{
    matrix ans(0,0,0,0);
    for(int i=0;i<=1;++i)
    {
        for(int j=0;j<=1;++j)
        {
            for(int g=0;g<=1;++g)
                ans.a[i][j]=(ans.a[i][j]+a.a[i][g]*b.a[g][j]);
        }
    }
    return ans;
}
matrix matrix_mul()
{
    matrix ans(1,0,0,1),a(1,-1,1,0);
    k-=2;
    while(k)
    {
        if(k&1)ans=mul(ans,a);
        k>>=1;
        a=mul(a,a);
    }
    return ans;
}
int main()
{
    while(cin>>x>>y>>k)
    {
        if(k==1)printf("%ld\n",(x%mod+mod)%mod);
        else if(k==2)printf("%ld\n",(y%mod+mod)%mod);
        else
        {
            matrix ans;
            LL re;
            ans=matrix_mul();
            re=(y*ans.a[0][0]+x*ans.a[0][1])%mod;
            printf("%ld\n",(re+mod)%mod);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/DA_A_MAO/article/details/81638789
今日推荐