🍑 OJ专栏
输入
1 1 3
1 2 10
0 0 0
输出
2
5
🤠 题意简单,数据范围大,找规律推公式
🍑 打表代码(找规律)
import java.util.Scanner;
public class Main
{
static int[] w = new int[10000];
public static void main(String[] args)
{
// a b 自定,一般测几组极端边界值和随机数据
int a = 11;
int b = 2;
w[1] = 1;
w[2] = 1;
for (int i = 2; i < 10000; i++)
w[i] = (a*w[i - 1] + b*w[i - 2]) % 7;
for (int i = 1; i <= 1000; )
{
// System.out.println(i + ":" + w[i] + " ");//全局打表找规律
//输出一个周期的所有数
for (int cnt = 1; cnt <= 48; cnt++)
System.out.print(w[i++] + ",");
System.out.println();
}
}
}
输出
🍑 从表可得,一个周期有 48 个数,每一组 a b 的数字序列都是 48 个数反复循环
⭐ 首先预处理1 ~ 48 之间的数,然后直接取值
🍑AC代码
import java.util.Scanner;
public class Main
{
static int N = 50;
static int[] w = new int[N];
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext())
{
int a = sc.nextInt();
int b = sc.nextInt();
int n = sc.nextInt();
if (a == 0 && b == 0 && n == 0)
break;
w[1] = 1;
w[2] = 1;
for (int i = 3; i <= 47; i++)
w[i] = (a * w[i - 1] + b * w[i - 2]) % 7;
w[0] = w[48];//48 % 48 == 0; 第 48 个数映射到 0 下标处
System.out.println(w[n % 48]);
}
}
}