Description
有一些{ 1 … n } \{1\dots n\} { 1 … n } 的子集A i , j , 1 ⩽ j ⩽ i ⩽ k A_{i,j}, 1\leqslant j\leqslant i\leqslant k A i , j , 1 ⩽ j ⩽ i ⩽ k 共k ( k + 1 ) 2 \frac{k(k+1)}2 2 k ( k + 1 ) 个,满足A i , j ⊂ A i + 1 , j , A i , j ⊂ A i , j + 1 A_{i,j}\subset A_{i+1,j}, A_{i,j}\subset A_{i,j+1} A i , j ⊂ A i + 1 , j , A i , j ⊂ A i , j + 1 。求这些集合有多少种方案。如果A A A 和B B B 两种方案中存在i , j i,j i , j 使得A i , j ≠ B i , j A_{i,j}\neq B_{i,j} A i , j = B i , j ,则它们是不同的。n , k ⩽ 1 0 9 n, k\leqslant 10^9 n , k ⩽ 1 0 9
Solution
对于n = 1 n=1 n = 1 求出方案数,之后将这个方案数取n n n 次幂即可。因为不同的元素之间是互不影响的。
n = 1 n=1 n = 1 时,我实际上要从
A 1 , 1 A 2 , 1 A 2 , 2 A 3 , 1 A 3 , 2 A 3 , 3 ⋮ ⋮ ⋮ ⋱ A k , 1 A k , 2 A k , 3 ⋯ A k , k \begin{matrix}
A_{1,1}\\
A_{2,1}&A_{2,2}\\
A_{3,1}&A_{3,2}&A_{3,3}\\
\vdots&\vdots&\vdots&\ddots\\
A_{k,1}&A_{k,2}&A_{k,3}&\cdots&A_{k,k}
\end{matrix}
A 1 , 1 A 2 , 1 A 3 , 1 ⋮ A k , 1 A 2 , 2 A 3 , 2 ⋮ A k , 2 A 3 , 3 ⋮ A k , 3 ⋱ ⋯ A k , k
这个三角中选出一些来包含1 1 1 。
那么,我从这个矩阵左下角即A k , 1 A_{k,1} A k , 1 的左下方开始,每次向右或上走一步,直到某个A i , i A_{i,i} A i , i 的左上角(或者A k , k A_{k,k} A k , k 的右下角);走出这个折线的右下的集合包含1 1 1 ,其它不包含1 1 1 。那么我一共会走( k − i + 1 ) + ( i − 1 ) = k (k-i+1)+(i-1)=k ( k − i + 1 ) + ( i − 1 ) = k 步,每步可以向右/下走,所以共有2 k 2^k 2 k 种方案。
综上,答案即为2 n k 2^{nk} 2 n k 。
Code
1 2 3 4 5 6 7 8 9 10 11 #include <cstdio> typedef long long LL;const int mod = 1000000007 ;int main () { int n, k; scanf ("%d%d" , &n, &k); int ans = 1 , x = 2 ; for (n = (LL)n * k % (mod - 1 ); n; n >>= 1 , x = (LL)x * x % mod) if (n & 1 ) ans = (LL)ans * x % mod; return printf ("%d\n" , ans) & 0 ; }