1 条题解
-
0
思路
首先,我们可以对于每一个数单独考虑,因为数之间互不影响,所以最后答案为每一个数的答案的 次幂。现在可以把问题转化为:在边长为 的三角形内填 或 ,要求如果一个位置为 ,它的左边和上面也必须为 。求方案数。
按列考虑。对于一列,数的分布是前面若干个 之后全都是 ,要不然不满足上面必须为 的限制了。再考虑列与列直接的关系,对于当前列,最下面的 必须在左边列最下面 的上面或同一行。如下图所示:

这个图中被红色笔划掉的就是 这一列不能放的。
所以,除了第一列,每一列的 的个数都是严格小于上一列的。
又发现,这个三角形要么全都是 ,要么一定会在某一列上变成全 ,后面也都是 了。
先不考虑全 的情况。设变成全 的列为第 列。如果设第 列有 个 ,则这 个 会被减 次(每一列严格小于上一列)。现在的问题变成了一个数减 次变成 的方案数。这个问题等价于一个数 被有顺序地分解成 个数的方案数。这相当于有 个球,分隔 次把它们变成 组。这个的方案数是在 个间隔中选 个间隔作为分隔点,。所以这一列全变成 的方案数是 。
把所有列变成 的方案数都加起来再加上全 的方案便是这个问题的方案:$C_{k}^0 + C_k^1 + \cdots + C_k^{k-1} +1=C_{k}^0 + C_k^1 + \cdots C_{k}^{k-1}+C_k^k=2^k$。(每个数都有选或不选的两种情况,一共有 个数,所以方案数是 )
这是一个数时的方案数。有 个数,方案数就是 的 次方。
代码
#include<bits/stdc++.h> #define int long long #define mod 1000000007 using namespace std; int qpow(int a,int b) { a%=mod; int ans=1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } signed main() { int n,k; cin>>n>>k; cout<<qpow(qpow(2,k),n); return 0; }
- 1
信息
- ID
- 6140
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者