首先想到的是进行归纳或者是进行分解,甚至是预习了一把特征方程相关知识。但是后面对于7的取模才让我恍然大悟。在网上看别人的想法都是认为1,1为循环节,但是假如a=7,b=7的时候呢?因为取模,导致除了第1 ,2 项,其他的全是0 ,所以认为1,1是循环结并不是正解。我认为确实是有循环数列,证明略,但是这个循环数列的长度是未知的,所以应该注意找出这个循环数列的开头和结尾,确定出要找的n在数列中的相对位置,然后再确定在整个数列中的绝对位置即可。
package com.company; import java.util.*; public class Main { public static void main(String[] args) { // write your code here Scanner sc = new Scanner(System.in); int a, b, n, j, k, temp, time; int[][] sum = new int[7][7]; int[] lp = new int[50]; a = sc.nextInt(); b = sc.nextInt(); n = sc.nextInt(); oo: while (true) { if (a == 0 && b == 0 && n == 0) break; if (n == 1) { System.out.println(1); } else { a %= 7; b %= 7; for (int i = 0; i < 7; i++) for (int p = 0; p < 7; p++) sum[i][p] = 0; j = k = 1; lp[0] = k; time = 1; while (sum[j][k] == 0) { if (time == n - 1) { System.out.println(j); a = sc.nextInt(); b = sc.nextInt(); n = sc.nextInt(); continue oo; } sum[j][k] = time; lp[time] = j; temp = (a * j + b * k) % 7; k = j; j = temp; time++; } n -= sum[j][k]; time -= sum[j][k]; System.out.println(lp[n % time +sum[j][k] - 1]); } a = sc.nextInt(); b = sc.nextInt(); n = sc.nextInt(); } } }