UVA11582 Colossal Fibonacci Numbers!
阿新 • • 發佈:2019-01-18
mat nac int sin class eof += ans new
題目地址
題目鏈接
題解
get一個新操作,序列的循環節
這據說這一種模數很小的序列的話都會有循環節?對這玩意有點萌幣。
如果\(Fib\)序列中在\(mod\space n\)的意義下,出現了連續的0和1,就說明出現了循環節,對這個循環節進行取膜就行了
本來還打了矩陣快速冪的結果沒用上
#include <bits/stdc++.h> using namespace std; #define ll unsigned long long ll a, b, mod; ll p[1010]; vector<ll>f[1010]; ll power(ll a, ll b, ll mod) { ll ans = 1; while(b) { if(b & 1) ans = ans * a % mod; a = a * a % mod; b >>= 1; } return ans % mod; } struct mat { ll m[2][2]; mat() { memset(m, 0, sizeof(m)); } mat operator * (mat &x) const { mat c; for(int k = 0; k < 2; ++k) { for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) { c.m[i][j] += m[i][k] * x.m[k][j]; c.m[i][j] %= mod; } } } return c; } }; mat mat_pow(ll b) { mat ans, a; ans.m[0][0] = ans.m[1][1] = 1; a.m[0][0] = a.m[1][0] = a.m[0][1] = 1; a.m[1][1] = 0; while(b) { if(b & 1) ans = ans * a; a = a * a; b >>= 1; } return ans; } int solve() { if(!a || mod == 1) return 0; ll t = power(a % p[mod], b, p[mod]); return f[mod][t]; } int main() { for(int n = 2; n <= 1000; ++n) { f[n].push_back(0); f[n].push_back(1); for(int i = 2; ; ++i) { f[n].push_back((f[n][i - 1] + f[n][i - 2]) % n); if(f[n][i] == 1 && f[n][i - 1] == 0) { p[n] = i - 1; break; } } } int T; scanf("%d", &T); while(T--) { scanf("%llu%llu%llu", &a, &b, &mod); printf("%llu\n", solve()); } return 0; }
UVA11582 Colossal Fibonacci Numbers!