1273-宣传墙
内存限制:64MB 时间限制:1000ms Special Judge: No
题目描述:
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]); } } }