在做其他事情时,我遇到了以下问题:
有一个 R 行和 C 列的网格。计算对这些方块的 B 进行着色的方式,以便每列都有偶数个有色方块。输出答案模10 ^ 9 + 7 。您可以假设 B甚至且 R> = B 。
我能想到的最好的是O(RB ^ 2 + CB)。该方法是一个简单的DP,其中状态是[您要着色的列,要留下多少个正方形颜色],并且递归涉及在此列中选择您想要着色的方块数。
答案 0 :(得分:2)
以下是使用生成函数查看此内容的方法。
对具有偶数个彩色方块的列着色方式的生成函数(多项式)是
a(x) = 1 + (R choose 2)x^2 + (R choose 4)x^4 + ...
您正在尝试计算(x)^ C中x ^ B的系数。你的方法是计算a(x),a(x)^ 2,a(x)^ 3的x ^ B项,...基本上是通过在每一步中乘以前几个项来计算。
通过连续平方计算a(x)^ C应该是一种改进:计算a(x)^ 2 ^ k的k值到log_2 C,然后将二进制扩展中对应的值相乘例如,如果C = 100 = 1100100_2,则计算a(x),a(x)^ 2,a(x)^ 4,... a(x)^ 64然后
a(x)^100 = a(x)^64 * a(x)^32 * a(x)^4.
这会占用更多内存,但如果这是一个问题,你可以计算^ 1,a ^ 2,a ^ 3,a ^ 6,a ^ 12,a ^ 24,a ^ 25,a ^ 50 ,a ^ 100,以便在每一步你方形或乘以a来计算^(前缀1100100_2)。
您可以更好地使用特定形式a(x)=((1 + x)^ R +(1-x)^ R)/ 2,比如应用二项式定理,但我没有让这种方法更快。