• 51Nod


     问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式 
    如果可以 输出 m%1e9+7 否则 输出no
     
     
    打表找规律。
    得到 ai = 6 * a[i - 1] - a[i - 2] - 2
    就硬找呗??
    然后矩阵快速幂。注意负数取模的细节
     
    值得一提的是,可以证明
     
     
    #pragma warning(disable:4996)
    
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<tuple>
    #include<unordered_map>
    #include<fstream>
    #include<iomanip>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<list>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    #define pb push_back
    #define INF 0x3f3f3f3f
    #define inf 0x7FFFFFFF
    #define moD 1000000003
    #define pii pair<int,string>
    #define eps 1e-8
    #define equals(a,b) (fabs(a-b)<eps)
    #define bug puts("bug")
    #define re  register
    #define fi first
    #define se second
    typedef  long long ll;
    typedef unsigned long long ull;
    const ll MOD = 1e9 + 7;
    const int maxn = 1e6 + 5;
    const double Inf = 10000.0;
    const double PI = acos(-1.0);
    using namespace std;
    
    
    struct Mat {
        ll m[3][3];
    };
    
    Mat E;
    Mat P;
    
    void init() {
        P.m[0][0] = 6;
        P.m[0][1] = -1;
        P.m[0][2] = 1;
        P.m[1][0] = 1;
        P.m[2][2] = 1;
        for (int i = 0; i < 3; i++) E.m[i][i] = 1;
    }
    
    Mat mul(const Mat& a, const Mat& b) {
        Mat c;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                c.m[i][j] = 0;
                for (int k = 0; k < 3; k++) c.m[i][j] = (c.m[i][j] + (a.m[i][k] * b.m[k][j]) % MOD) % MOD;
            }
        }
        return c;
    }
    
    Mat quickPower(Mat a, ll b) {
        Mat ans = E;
        Mat base = a;
        while (b) {
            if (b & 1) ans = mul(ans, base);
            base = mul(base, base);
            b >>= 1;
        }
        return ans;
    }
    
    int main() {
        ll n;
        scanf("%lld", &n);
        init();
        if (!n) {
            puts("1");
            return 0;
        }
        if (n == 1) {
            puts("2");
            return 0;
        }
        else if (n == 2) {
            puts("9");
            return 0;
        }
        P = quickPower(P, n - 2);
        ll res = (((P.m[0][0] * 9) % MOD + P.m[0][1] * 2) % MOD + (-2 * P.m[0][2] % MOD + MOD) + MOD) % MOD;
        printf("%lld", res);
    }
  • 相关阅读:
    ubuntu升级显卡驱动
    __slots__属性,声明实力属性名字列表
    isinstance 与 type 的区别
    conda使用技巧
    卷积神经网络参数
    apache nginx php不显示版本号
    30个实用的Linux find命令示例
    账号的管理的那点事
    Linux 命令整理 —— 基本操作
    Linux 命令整理 —— 用户管理
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13383926.html
Copyright © 2020-2023  润新知