您的位置:首页 > Web前端 > JavaScript

【JSOI2015】【JZOJ 4058】子集选取

2017-02-11 20:46 441 查看

Description





Analysis

设F(n,k)表示读入n,k的答案

First step

考虑到每个元素之间其实是互相独立的,所以F(n,k)=F(1,k)n

我们只需快速求出F(1,k)

Second step

这是一个三角形

A[i]表示第i列最后一个1的行(该行以上全为1,以下全为0)

显然有A[i]>=A[i+1]

设G[i][j]表示第i行,最后一个1的行为j的方案数,则

G[i][j]=∑kp=jG[i−1][p]=G[i−1][j]+G[i][j+1]

这便是组合数的形式

写出来,发现其实是倒放的杨辉三角

G[i,j]

1

14

136

1234

11111

因为可以在任意一个位置结束,也可以全不选,所以

F(1,k)=1+∑G[i][j]=2k

所以Ans=2nk

Code

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=11,mo=1e9+7;
ll n,k;
ll qmi(ll x,ll n)
{
ll t=1;
for(;n;n>>=1)
{
if(n&1) t=t*x%mo;
x=x*x%mo;
}
return t;
}
int main()
{
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%lld %lld",&n,&k);
printf("%lld\n",qmi(2,n*k));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: