模3问题

本文介绍了一个使用Java实现的大数动态规划问题解决方案,通过BigInteger类处理大整数运算,避免了整数溢出的问题。该程序实现了基于用户输入n的特定动态规划算法,计算并输出了特定数列的第n项。
import java.math.BigInteger;
import java.util.Scanner;

public class five {

	public static void main(String[] args) {
		BigInteger[][] f = new BigInteger[100001][4];
		int n,i;
		Scanner sc = new Scanner(System.in); 
		n = sc.nextInt();
		BigInteger one = new BigInteger("1");
		BigInteger two = new BigInteger("2"); 
		BigInteger big = new BigInteger("100007");
		f[1][0] = two;
		f[1][1] = one;
		f[1][2] = two;
		for(i = 2;i <= n;i++){
			f[i][0] = ((one.multiply(f[i-1][0])).add(two.multiply(f[i-1][1]))).add(two.multiply(f[i-1][2]));
			f[i][1] = ((two.multiply(f[i-1][0])).add(one.multiply(f[i-1][1]))).add(two.multiply(f[i-1][2]));  
			f[i][2] = ((two.multiply(f[i-1][0])).add(two.multiply(f[i-1][1]))).add(one.multiply(f[i-1][2]));
			 
		}
		System.out.println(((f[n][1]).subtract(one)).remainder(big));
	}

}

如果你要计算f[i][0]的话,你肯定是由f[i-1][0],f[i-1][1],f[i-1][2]三个值地推来的,

如果是f[i-1][0]的话,说明原来的数模3除尽了,所以这个时候再加一位数,这个数只能是3,

如果是f[i-1][1]的话,说明原来的数模3除余1,所以这个时候再加一位数,这个数可能是2或者5,这两种情况,所以这种情况共有2*f[i-1][1]个,

如果是f[i-1][2]的话,说明原来的数模3除余2,所以这个时候再加一位数,这个数可能是1或者4,这两种情况,所以这种情况共有2*f[i-1][2]个

总的f[i][0]就是这三种情况的总和,,f[i][0]=f[i-1][0]+f[i-1][1]*2+f[i-1][2]*2



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值