标签:
百度外卖“附近的餐厅”展示的是一个 N 行 4 列的网格,里面放的原本都是占 1 行 1 列的正方餐厅广告,新来的设计师du熊同学正在考虑一种新的设计方案,来更好的展示附近的餐厅。
作为设计师的du熊希望在 N 行 4 列的网格里先行放入若干占 1 行 1 列的正方餐厅广告,使得剩下来的空间,可以被占 1 行 2 列或 2 行 1 列的长条餐厅广告完美覆盖。du熊希望让你帮他确定,到底有多少种放置若干正方餐厅广告的方案,使得放置若干正方餐厅广告以后剩下的空间可以被若干 1 行 2 列或 2 行 1 列的长条餐厅广告完美覆盖。
完美覆盖即每个没有放入正方餐厅广告的位置会被长条餐厅广告覆盖恰好一次,且广告不可超出页面边界(如果所有的位置都已放入正方餐厅广告也属于完美覆盖)。
因为方案数会很多,我们希望你输出方案数对 1,000,000,007 取模的结果。
输入格式
输入第一行为一个整数 T (1 ≤ T ≤ 20),表示数据组数。
接下来一共 T 行,每行为一个正整数 N (1 ≤ N ≤ 1018),代表页面的长度。
对于简单版本,1 ≤ n ≤ 6;
对于中等版本,1 ≤ n ≤ 1000;
对于困难版本,1 ≤ n ≤ 1018。
输出格式
一共输出 T 行,每行输出该组数据对应的方案数对 1,000,000,007 取模的结果。
样例1
输入:
4
1
2
3
100
输出:
5
54
550
397280121
提示信息
对于样例中的第一组数据,一共有 5 种方案(放了 1 行 1 列广告的位置标记为 1,余下为 0):
0000
1100
0011
1001
1111
对于上述 5 种方案,剩下的位置都可以由 1 行 2 列的广告铺满。
def func(lst,n):
if max(lst)>n:
return 0
if max(lst)==n and min(lst)==n:
return 1
k=min(lst)
result=0
for i in range(0,4):
if lst[i]==k:
lstNext=lst.copy()
lstNext[i]+=1
result+=func(lstNext,n)
lstNext=lst.copy()
lstNext[i]+=2
result+=func(lstNext,n)
if i+1<4 and lst[i+1]==k:
lstNext=lst.copy()
lstNext[i]+=1
lstNext[i+1]+=1
result+=func(lstNext,n)
return result
lst=[0 for i in range(0,4)]
N=int(input())
for i in range(0,N):
k=int(input())
print(func(lst.copy(),k))
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zhangzhengyi03539/article/details/47067517