zoukankan      html  css  js  c++  java
  • HRBUST 1430 矩阵快速幂

    没错就是这道模板题我做了一个小时...我居然在看第一眼就认为是快速幂的情况下强行找了一发瞬时求出的规律

    每个阶段有黑白两种 a[i].black=a[i-1].black*3+a[i].white      a[i].white=a[i-1].black+a[i-1].white*3

    求每个阶段的black

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<math.h>
    using namespace std;
    #define mod 1000000007
    long long int a[2];
    long long int b[2][2];
    void init()
    {
        a[0]=1;
        a[1]=0;
        b[0][0]=3;
        b[0][1]=1;
        b[1][0]=1;
        b[1][1]=3;
    }
    void cheng()
    {
        long long q=((a[0]*b[0][0])%mod+(a[1]*b[1][0])%mod)%mod;
        long long w=((a[0]*b[0][1])%mod+(a[1]*b[1][1])%mod)%mod;
        a[0]=q;
        a[1]=w;
        return ;
    }
    void ch()
    {
        long long int z[2][2];
        for(int i=0;i<2;i++)
        {
            for(int k=0;k<2;k++)
            {
                z[i][k]=0;
                for(int j=0;j<2;j++)
                {
                    z[i][k]+=(b[i][j]*b[j][k])%mod;
                }
                z[i][k]%=mod;
            }
        }
        for(int i=0;i<2;i++)
        for(int k=0;k<2;k++)
        {
            b[i][k]=z[i][k];
        }
        return ;
    }
    void cal(long long int n)
    {
        if(n==0)
        return ;
        if(n%2==0)
        {
            n/=2;
            ch();
            cal(n);
        }
        else if(n%2!=0)
        {
            n--;
            cheng();
            cal(n);
        }
    }
    long long n;
    int main(){
    while(~scanf("%lld",&n))
    {
        init();
        cal(n);
        printf("%lld
    ",a[0]);
    }
    }
    
  • 相关阅读:
    hadoop中map和reduce的数量设置问题
    Flink基础
    Leetcode中的SQL题目练习(二)
    Redis-2- 基本概念
    Redis-1-安装
    C#事件(1)
    java(13)内部类
    java(12)异常处理
    java(11)构造器
    java(10)接口抽象类
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5312632.html
Copyright © 2011-2022 走看看