关于 ZJCPC2004第二题

来源:互联网 发布:tvp动画软件 编辑:程序博客网 时间:2024/06/14 05:07

首先想到的是进行归纳或者是进行分解,甚至是预习了一把特征方程相关知识。但是后面对于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();        }    }}

0 0
原创粉丝点击