HDU 4291 A Short problem 矩阵快速幂 循环节

题解思路:

构造矩阵,矩阵乘法计算还是t;

需要找循环节;   (注意因为是复合函数,不可以在里面取mod)

暴力跑只有可以找到g(222222224)%1e9==g(0)%1e9;

所以 g(g(n)%222222224)%1e9==g(g(n));

之后还可以跑出2个循环节

从内到外

240  183120 222222224 1e9+7

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<stack>

#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define int long long

const int maxn=65000+10;

using namespace std;

int prime[maxn],is_prime[maxn];

struct Matrix
{
    int nmap[3][3];
};

Matrix initA={
    0,0,0,
    0,1,0,
    0,0,1,
};

Matrix T=
{
    0,0,0,
    0,0,0,
    0,0,0,
};

void is_p(){
    for(int i=2;i<=maxn;i++)
    {
        if(!is_prime[i])
        for(int j=i+i;j<maxn;j+=i)
        {
            is_prime[j]=1;
        }
    }
}

ll pow(ll a,ll b,ll mod)
{
    ll sum=1;
    while(b)
    {
        if(b&1) sum=(sum*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return sum%mod;
}

void put(Matrix x)
{
    for(int i=1;i<=2;i++)
    {
        for(int j=1;j<=2;j++)
        {
            cout<<x.nmap[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}


Matrix Matrix_mul(Matrix a,Matrix b,int mod)
{
    Matrix A=T;
    for(int k=1;k<=2;k++)
    {
        for(int i=1;i<=2;i++)
        {
            if(a.nmap[i][k])
            for(int j=1;j<=2;j++)
            {
                A.nmap[i][j]+=(a.nmap[i][k]*b.nmap[k][j])%mod;
                A.nmap[i][j]%=mod;
            }
        }
    }
    return A;
}


Matrix Matrix_smul(Matrix a,int b,int mod)
{
    Matrix A=initA;
    if(b==-1) return a;
    while(b)
    {
        if(b&1) A=Matrix_mul(A,a,mod);
        a=Matrix_mul(a,a,mod);
        b>>=1;
    }
    return A;
}

#undef int
int main(){
#define int long long
    Matrix C={
        0,0,0,
        0,3,1,
        0,1,0,
    };
    Matrix D=
    {
        0,0,0,
        0,0,0,
        0,1,0,
    };
    int n=1,mod=1e9+7;
    while(~scanf("%lld",&n))
    {
                n%=240;
                mod=183120;
                Matrix B=Matrix_smul(C,n,mod);
                B=Matrix_mul(B,D,mod);
               // put(B)
                mod=222222224;
                B=Matrix_smul(C,B.nmap[1][1],mod);
                B=Matrix_mul(B,D,mod);
               // put(B);
                mod=1e9+7;
                B=Matrix_smul(C,B.nmap[1][1],mod);
                B=Matrix_mul(B,D,mod);
               // put(B);
                printf("%lld\n",B.nmap[1][1]);
        }
   // }
/*    int a=1,b=0,c,mod=240,ok=0;//跑循环节的代码...
    for(int i=1;;i++)
    {
        c=(3*a+b)%mod;
        b=a%mod;
        a=c%mod;
        if(a==1&&b==0){
            cout<<i<<endl;
            ok++;
            if(ok>10) break;
        }
    }
*/
    return 0;
}



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值