探讨一道有趣的题目

adfas 2009-05-18 03:07:47
原题链接http://acm.pku.edu.cn/JudgeOnline/problem?id=3734
说有n个砖块,有4种颜色(红,蓝,绿,黄),现在用这四种颜色给这n块砖涂上颜色。并且要求红色和绿色砖块的数目均为偶数。
问一共有多少种方法。

貌似能推导出o(1)组合数学办法,可是我想不出来。
...全文
155 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tian428 2009-05-19
  • 打赏
  • 举报
回复
所以,直接套4^(n-1)+2^(n-1)的公式计算 o(1)
...
纯数学问题
tian428 2009-05-19
  • 打赏
  • 举报
回复
假设n个砖块红绿都为偶数的方法数为f(n), 红绿都为奇数的方法数为g(n);
n个砖块,可以看做原来有n-1个砖头,再加一个砖头.原来那n-1个砖头的染色方法有如下可能:
1.已经是红绿都为偶数,那剩下的那块砖头必定是黄或蓝,这种情况下有2*f(n-1)种方法;
2.红绿都为奇数,此时无论剩下的那块砖头染何种颜色都无法满足红绿都为偶数的条件;
3.此外(即红绿一奇一偶),剩下的那块砖头必定要染前n-1红绿中为奇的那种颜色,这种情况下有4^(n-1)-f(n-1)-g(n-1)种方法 (即总方法数减去全奇和全偶的方法数)

所以 f(n)=2*f(n-1)+4^(n-1)-f(n-1)-g(n-1)=4^(n-1)+f(n-1)-g(n-1)
同理可推g(n)=2*g(n-1)+4^(n-1)-f(n-1)-g(n-1)=4^(n-1)+f(n-1)-g(n-1)

所以 f(n)=4^(n-1)+f(n-1)-g(n-1)
=4^(n-1)+(4^(n-2)+f(n-2)-g(n-2))-(4^(n-2)+f(n-2)-g(n-2))
=4^(n-1)+2*(f(n-2)-g(n-2))
=...
=4^(n-1)+2^(n-2)*(f(1)-g(1)) 掰掰手指就可以知道f(1)=2,g(1)=0;
=4^(n-1)+2^(n-1)


题外话,同理可以推得g(n)=4^(n-1)-2^(n-1)
绿色夹克衫 2009-05-19
  • 打赏
  • 举报
回复
不好意思,看了一下原题,似乎排列顺序也需要考虑进去,那答案的数量就多多了。

给出的例子里面2块的答案是6,如果不考虑顺序的话,2块的答案应该是5。原题里面说的是n块砖排成1排,有多少种涂法!

根据原题来推的话,似乎是4^(n-1) + 2^(n-1),说实话,基本上是靠凑数弄出来的

求mod 10007 可以到log(n),不过mod的结果应当存在一个循环节,利用预运算计算出循环节的长度,是有可能达到O(1)的。
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
自己测了几个,好像是对的,改写成关于n的公式

n为奇数:(n+1)(n+3)(n+5)/24
n为偶数:(n+2)(n+3)(n+4)/24

推导的方法大概是,先将n分为2部分,其中一部分为偶数(P0),另一部分可以是奇数,也可以是偶数(P1)
共(n/2) + 1项

P0可以分为2部分,共(P0 / 2) + 1项(对应必须为偶数的两种颜色)
P1可以分为2部分,共(P1 + 1)项(对应可以为奇数的两种颜色)

可以推出f(n) = f(n - 2) + ((n / 2) + 1) ^ 2 n为偶数
可以推出f(n) = f(n - 2) + (n / 2) ^ 2 + (n / 2) n为奇数

然后利用平方和公式,应该能够推出最后的结果。
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
如果对了,我再详细说怎么推的!否则白浪费感情!
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
推了一个,LZ验证一下吧!

n为奇数(m = n + 1 / 2):m(m + 1)(m + 2)/3
n为偶数(m = n / 2):(m + 1)(m + 2)(2m + 3)/6
adfas 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tian428 的回复:]
感觉推出一个公式,就是o(1)了,这样就成了纯数学问题。。。
另可不可以某种颜色用了0次?
[/Quote]

可以为0,0是偶数
tian428 2009-05-18
  • 打赏
  • 举报
回复
感觉推出一个公式,就是o(1)了,这样就成了纯数学问题。。。
另可不可以某种颜色用了0次?
adfas 2009-05-18
  • 打赏
  • 举报
回复
没关系啦,大牛帮想想,生成函数是很好列的,可是如何化简到o(1),就不晓得了。囧= =
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
不好意思,上面给的递推真是错误百出,没有仔细考虑,另外也不是O(1)的!
应该可以通过组合直接求出来!

[Quote=引用 1 楼 litaoye 的回复:]
递推?

f(n) = f(n - 1) * 2 + f(n - 2) * 2
[/Quote]
adfas 2009-05-18
  • 打赏
  • 举报
回复
N比较大10^9,最好想下看有无o(1)的计算公式,根据ac率和数据规模,应该是有的。可是偶想不到。
大牛帮忙想啊,这题还是有较强的探讨价值的
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
递推?

f(n) = f(n - 1) * 2 + f(n - 2) * 2

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧