关于 ZJCPC2004第二题

首先想到的是进行归纳或者是进行分解,甚至是预习了一把特征方程相关知识。但是后面对于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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值