HDU_2256
这个题目用快速幂+fmod是AC不了的,应该是浮点数精度的原因,推导的过程都体现在图上了,剩下的工作就是二分矩阵求解了。
此外,在计算完x[n]和y[n]之后不能直接用(x[n]+(int)(y[n]*sqrt(6.0)))%1024来得到最后的结果的,先取整再模和先模再取整的结果是不一样的这一点举个例子就比较容易看出来了。
比如(2000*1.372)%1000,这样先乘再取模得到的结果就是744,如果先把2000模1000,显然最后结果就是0了。
#include<stdio.h> #include<string.h> #include<math.h> #define MAXD 2 int N, cnt; struct Matrix { int a[MAXD][MAXD]; void init() { a[0][0] = a[1][1] = 5, a[0][1] = 12, a[1][0] = 2; } }mat[150]; int multiply(int x, int y) { int i, j, k, z = ++ cnt, ans; for(i = 0; i < 2; i ++) for(j = 0; j < 2; j ++) { ans = 0; for(k = 0; k < 2; k ++) ans += mat[x].a[i][k] * mat[y].a[k][j]; mat[z].a[i][j] = ans & 1023; } return z; } int powmod(int n) { int k; if(n == 1) return 0; k = powmod(n >> 1); k = multiply(k, k); if(n & 1) k = multiply(k, 0); return k; } void solve() { int k, ans, x, y; cnt = 0; mat[0].init(); k = powmod(N); ans = (2 * mat[k].a[0][0] - 1 + 1024) & 1023; printf("%d\n", ans); } int main() { int t; scanf("%d", &t); while(t --) { scanf("%d", &N); solve(); } return 0; }