使用矩阵的方法解决zoj2105
结果出现了一下两种情况:
仅仅是改了一下求第n项,变为先求第n-1,n-2项,再求第n项!结果竟是不一样~~路过的大牛指导一下,谢谢!!
Wrong的代码:
/* * zoj2105.c * * Created on: 2011-9-20 * Author: bjfuwangzhu */ #include#define nmax 2 #define nnum 7 typedef struct matrix { int num[nmax][nmax]; } matrix; matrix mul_matrix(matrix a, matrix b) { matrix c; int i, j, k; for (i = 0; i < nmax; i++) { for (j = 0; j < nmax; j++) { c.num[i][j] = 0; for (k = 0; k < nmax; k++) { c.num[i][j] += a.num[i][k] * b.num[k][j] % nnum; c.num[i][j] %= nnum; } } } return c; } void solve(int a, int b, int n) { matrix temp, res; res.num[0][0] = 1, res.num[1][1] = 1, res.num[1][0] = res.num[0][1] = 0; temp.num[0][0] = a % nnum, temp.num[0][1] = b % nnum, temp.num[1][0] = 1, temp.num[1][1] = 0; while (n) { if (n & 1) { res = mul_matrix(res, temp); } temp = mul_matrix(temp, temp); n >>= 1; } printf("%d\n", res.num[0][0]); } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif int a, b, n; while (~scanf("%d %d %d", &a, &b, &n)) { if (a == 0 && b == 0 && n == 0) { break; } if (n == 1 || n == 2) { puts("1"); continue; } solve(a, b, n - 1); } return 0; }
Accept的代码:
/* * zoj2105.c * * Created on: 2011-9-20 * Author: bjfuwangzhu */ #include#define nmax 2 #define nnum 7 typedef struct matrix { int num[nmax][nmax]; } matrix; matrix mul_matrix(matrix a, matrix b) { matrix c; int i, j, k; for (i = 0; i < nmax; i++) { for (j = 0; j < nmax; j++) { c.num[i][j] = 0; for (k = 0; k < nmax; k++) { c.num[i][j] += a.num[i][k] * b.num[k][j] % nnum; c.num[i][j] %= nnum; } } } return c; } void solve(int a, int b, int n) { matrix temp, res; res.num[0][0] = 1, res.num[1][1] = 1, res.num[1][0] = res.num[0][1] = 0; temp.num[0][0] = a % nnum, temp.num[0][1] = b % nnum, temp.num[1][0] = 1, temp.num[1][1] = 0; while (n) { if (n & 1) { res = mul_matrix(res, temp); } temp = mul_matrix(temp, temp); n >>= 1; } printf("%d\n", (res.num[0][0] + res.num[0][1]) % nnum); } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif int a, b, n; while (~scanf("%d %d %d", &a, &b, &n)) { if (a == 0 && b == 0 && n == 0) { break; } if (n == 1 || n == 2) { puts("1"); continue; } solve(a, b, n - 2); } return 0; }
另一种写法,找规律:
#includeusing namespace std; int main() { int A, B, n, i, a[2000]; while (cin >> A >> B >> n) { if (A == 0 && B == 0 && n == 0) break; if (n == 1 || n == 2) { cout << "1" << endl; continue; } a[1] = 1; a[2] = 1; A %= 7; B %= 7; for (i = 3; i < 2000; i++) { a[i] = (A * a[i - 1] + B * a[i - 2]) % 7; if (a[i - 1] == 1 && a[i] == 1) break; } i -= 2; n %= i; a[0] = a[i]; cout << a[n] << endl; } return 0; }