Best SolverTime Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 229 Accepted Submission(s): 98
Problem Description
The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart.
It is known that y=(5+26√)1+2x . For a given integer x (0≤x<232) and a given prime number M (M≤46337) , print [y]%M . ( [y] means the integer part of y )
Input
An integer
T (1<T≤1000) , indicating there are
T test cases.
Following are T lines, each containing two integers x and M , as introduced above.
Output
The output contains exactly
T lines.
Each line contains an integer representing [y]%M .
Sample Input
Sample Output
|
比赛时卡在这道题了,醉了。
打表找出循环节loop = (M - 1) * (M + 1),然后求解 2^n % loop,下面就是矩阵快速幂裸题了。
提交6次代码才过,CE5次。杭电要炸了。。。
找循环节解析链接:点我
裸题链接:点我
AC代码:
#include <cstdio> #include <cstring> #include <cmath> #define LL long long struct Matrix { LL a[3][3]; }; Matrix ori, res; LL M; void init() { memset(ori.a, 0, sizeof(ori.a)); memset(res.a, 0, sizeof(res.a)); for(int i = 0; i < 2; i++) res.a[i][i] = 1; ori.a[0][0] = 5, ori.a[0][1] = 2; ori.a[1][0] = 12, ori.a[1][1] = 5; } Matrix muitl(Matrix x, Matrix y) { Matrix z; memset(z.a, 0, sizeof(z.a)); for(int i = 0; i < 2; i++) { for(int k = 0; k < 2; k++) { if(x.a[i][k] == 0) continue; for(int j = 0; j < 2; j++) z.a[i][j] = (z.a[i][j] + (x.a[i][k] * y.a[k][j]) % M) % M; } } return z; } LL F[3], ans[3]; int k = 1; void solve(LL n) { while(n) { if(n & 1) res = muitl(ori, res); ori = muitl(ori, ori); n >>= 1; } for(int i = 0; i < 2; i++) { ans[i] = 0; for(int k = 0; k < 2; k++) ans[i] = (ans[i] + (F[k] * res.a[k][i]) % M) % M; } printf("Case #%d: %lld\n", k++, (2*ans[0] - 1) % M); } LL pow_mod(LL a, LL p, LL n) { if(p == 0) return 1; LL ans = pow_mod(a, p/2, n); ans = ans * ans % n; if(p % 2 == 1) ans = ans * a % n; return ans; } int main() { int t; LL n, N; F[0] = 5, F[1] = 2; scanf("%d", &t); while(t--) { scanf("%lld%lld", &n, &M); LL loop = (M+1) * (M-1);//循环节 LL N = pow_mod(2, n, loop) + 1;//快速幂 求解2^n % loop init();//构造矩阵 solve(N-1);//矩阵快速幂 } return 0; }