hdu 5667 Sequence(矩陣快速冪+費馬小定理+快速冪)
阿新 • • 發佈:2019-01-29
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <list> #include <queue> #include <map> #include <stack> using namespace std; #define L(i) i<<1 #define R(i) i<<1|1 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-9 #define maxn 100010 #define MOD 1000000007 int N; long long p,a,b,c; struct Matrix { long long a[22][22]; Matrix() { memset(a,0,sizeof(a)); for(int i = 0; i < N; i++) a[i][i] = 1; } }; Matrix operator*(Matrix A,Matrix B) { Matrix ans; for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) { ans.a[i][j] = 0; for(int k = 0; k < N; k++) ans.a[i][j] += (A.a[i][k] * B.a[k][j])%(p-1); ans.a[i][j] %= (p-1); } return ans; } Matrix Pow(Matrix A,long long n) { Matrix ans; while(n) { if(n % 2) ans = ans * A; n /= 2; A = A * A; } return ans; } long long mod_pow(long long aa,long long bb,long long mod) { long long ans = 1; while(bb) { if(bb&1) ans *= aa; ans %= mod; bb /= 2; aa *= aa; aa %= mod; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { N = 3; long long n; scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&p); if(n==1) { printf("1\n"); continue; } if(n==2) { printf("%lld\n",mod_pow(a,b,p)); continue; } Matrix A; memset(A.a,0,sizeof(A.a)); A.a[0][0] = c; A.a[0][1] = 1; A.a[0][2] = b; A.a[1][0] = 1; A.a[2][2] = 1; A = Pow(A,n-2); long long k = A.a[0][0] * b + A.a[0][2]; k = mod_pow(a,k,p); printf("%lld\n",k); } }