楼主:
GYLin (Lynx)
2017-11-20 09:45:02问题连结: http://codeforces.com/contest/894/problem/B
总之就是给定矩阵大小 n * m (n列, m行)
和 k (1 或 -1)
每一列和每一行的乘积都必须要是 k
请问矩阵可以有几种填法
====================================
我一开始的想法是
先从第一列填到倒数第二列, 每一列都确保乘积是k,
所以如果 k = 1, 就确保有偶数个 -1, 那就是 C(m, 0) + C(m, 2)...
每一列的组合基本上都是这样, 所以一直给他乘, 算出前 n - 1 列的组合:
(C(m, 0) + C(m, 2) + ... ) ^ (n - 1)
然后因为剩下最后一列, 已经只有一个选择了, 就乘1
(决定前 n - 1 列等于决定第n列, 因为每一行乘积都要是k)
但这样的算法在这题完全没用, 因为 n 跟 m 的范围极大 ( <= 10^18 )
然后答案要 mod 10^9 + 7
但是组合数量要用到除法, 不可以用余数运算,
所以应该是用动态规划之类的, 但是想不太到QQ
(C版首发, 其实不知道能不能问这类问题, 有违反版规请鞭QQ)
作者:
oToToT (å±å©)
2017-11-21 01:01:00快速幂弄一下就好了(那场好血腥话说你都列出C(m, 0)+C(m, 2)+...了,那其实那串直接就是2^(m-1),因为C(m, 0)+C(m, 1)+...+C(m, m)=2^m