1. 程式人生 > 實用技巧 >51Nod - 1537 分解

51Nod - 1537 分解

問(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); }