zoukankan      html  css  js  c++  java
  • hdu4291 A Short problem

    给出一个广义斐波那契数列,求套娃后的值
    这不是傻逼题吗?来几个循环节就行了
    暴力求循环节

    #include<cstdio>
    #define ll long long
    const ll MOD = 1e9 + 7;
    int main() {
        ll a, b; // f[n] = (bf[n - 1] + af[n - 2]) % mod;
        a = 1;
        b = 3;
        for(ll i = 1; ; i++) {
            if(a == 0 && b == 1){
                printf("%lld
    ", i);
                break;
            }
            ll c = (3 * b + a) % MOD;
            a = b, b = c;
        }
        return 0;
    }
    

    求出
    1e9 + 7 的循环节 222222224
    222222224 的循环节 183120
    也就是说,最里面那层的mod是183120,第二层是222222224,第三层是1e9+7

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    const int N = 2;
    struct Matrix{
        int n, m;
        ll a[N][N];
        Matrix(int n = 0, int m = 0):n(n),m(m){memset(a, 0, sizeof(a));}
    };
    Matrix mul(Matrix a, Matrix b, ll mod) {
        Matrix ans(a.n, b.m);
        for(int i = 0; i < a.n; i++) {
            for(int j = 0; j < b.m; j++) {
                for(int k = 0; k < a.m; k++) {
                    ans.a[i][j] = (ans.a[i][j] + a.a[i][k] * b.a[k][j] % mod) % mod;
                }
            }
        }
        return ans;
    }
    Matrix ksm(Matrix a, ll b, ll mod){
        Matrix ans(a.n, a.m);
        for(int i = 0; i < max(a.n, a.m); i++) ans.a[i][i] = 1;
        while(b){
            if(b & 1) ans = mul(ans, a, mod);
            a = mul(a, a, mod);
            b >>= 1;
        }
        return ans;
    }
    ll f(ll n, ll mod){
        if(n == 0) return 0 % mod;
        if(n == 1) return 1 % mod;
        if(n == 2) return 3 % mod;
        Matrix base(2, 2);
        Matrix ans(2, 1);
        base.a[0][0] = 3, base.a[0][1] = 1;
        base.a[1][0] = 1, base.a[1][1] = 0;
        base = ksm(base, n - 2, mod);
        ans.a[0][0] = 3, ans.a[1][0] = 1;
        ans = mul(base, ans, mod);
        return ans.a[0][0];
    }
    int main(){
        ll n;
        while(~scanf("%lld", &n)) {
            ll ans = f(n, 183120);
            ans = f(ans, 222222224);
            ans = f(ans, 1e9 + 7);
            printf("%lld
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    TL 重构
    eclipse中使用Lombok
    一个成功的 Git 分支模型
    《重构,改善既有代码的设计》读书笔记
    重构——改善既有代码的设计
    安装Mysql5.7并修改初始密码
    支付宝支付-PC电脑网站支付
    sqlite3 线程模型
    sqlite 常用的一些语句
    Electron 入门第一篇
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13825667.html
Copyright © 2011-2022 走看看