时间限制: 1 Sec 内存限制: 128 MB
提交: 53 解决: 16
[提交] [状态] [讨论版] [命题人:admin]
题目描述
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 取模后的结果。
样例输入 Copy
2
6 3 2
5 3 2
样例输出 Copy
5 5
5 1
来源/分类
当仅仅只有一行的时候 要想摆满只能有一种情况,1X2的横着摆两个;
所以可以求摆满了n行的第n + 1次 空的情况即是方案数;分析某一行,对于某一行摆的情况有16种;
很显然,第0种情况可以由第0, 5, 7,8, 15种情况得到,去掉没有必要推的情况,就只有6种情况;
0, 5,6, 7, 8, 15
#include<bits/stdc++.h>
using namespace std;
int a[1000000][6]; // 6种情况
int mod = 997;
int main(){
a[1][0] = 1;
for (int i = 2; i <= 1000000; i++) //打表
{
a[i][0] = (a[i - 1][0] + a[i - 1][1] + a[i - 1][3] + a[i - 1][4] + a[i - 1][5]) % mod;
a[i][1] = (a[i - 1][0] + a[i - 1][3]) % mod;
a[i][2] = a[i - 1][4] % mod;
a[i][3] = (a[i - 1][1] + a[i - 1][0]) % mod;
a[i][4] = (a[i - 1][2] + a[i - 1][0]) % mod;
a[i][5] = a[i - 1][0] % mod;
}
int t;
cin >> t;
while (t--)
{
int n, m, k;
cin >> n >> m >> k;
cout << a[m][0] << " " << a[n - m - k + 2][0] << endl;
}
return 0;
}