第九届河南省程序设计大赛 1273-宣传墙(java)

1273-宣传墙


内存限制:64MB  时间限制:1000ms  Special Judge: No

accepted:6  submit:12

题目描述:

ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多。CBA 镇长准备在一条道路南 面 4*N 的墙上做一系列的宣传。为了统一规划,CBA 镇长要求每个宣传栏只能占相邻的两个方格 位置。但这条道路被另一条道路分割成左右两段。CBA 镇长想知道,若每个位置都贴上宣传栏, 左右两段各有有多少种不同的张贴方案。 例如: N=6,M=3, K=2, 左,右边各有 5 种不同的张贴方案 


输入描述:

第一行: T 表示以下有 T 组测试数据 ( 1≤T ≤8 ) 接下来有T行, 每行三个正整数 N M K 分别表示道路的长度,另一条道路的起点和宽度 (1≤ N ,M ≤ 1 000 000, 1≤ K ≤ 100000)

输出描述:

每组测试数据,输出占一行:两个整数,分别表示左右两段不同的张贴方案数。由于方案总数 可能很大,请输出对 997 取模后的结果。

样例输入:

复制
2
6 3 2
5 3 2

样例输出:

5 5
5 1
import java.util.Scanner;

public class Main {
	static int Mod=997;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int[] d=new int[1100000];
	    int[] s=new int[2];
	    int[] q=new int[2];
		int sum=6;
		q[0]=3;
		q[1]=2;
		d[1]=1;
		d[2]=5;
		s[1]=1;
		s[0]=5;
		for(int i=3;i<=1000000;i++)
		{
			d[i]=(sum*2+s[i%2]-d[i-1]+d[i-2]+Mod+q[i%2])%Mod;
			s[i%2]=(s[i%2]+d[i])%Mod;
			sum=(sum+d[i])%Mod;
		}
		int T=sc.nextInt();
		while(T-->0){
			int n=sc.nextInt();
			int m=sc.nextInt();
			int k=sc.nextInt();
			System.out.println(d[m-1]+" "+d[n-m-k+1]);
		}
	}

}


猜你喜欢

转载自blog.csdn.net/hui_1997/article/details/80258320