4475: [Jsoi2015]子集选取

4475: [Jsoi2015]子集选取

Time Limit: 1 Sec   Memory Limit: 512 MB
Submit: 185   Solved: 132
[ Submit][ Status][ Discuss]

Description

Input

输入包含一行两个整数N和K,1<=N,K<=10^9

Output

一行一个整数,表示不同方案数目模1,000,000,007的值。

Sample Input

2 2

Sample Output

16

HINT

Source

[ Submit][ Status][ Discuss]

假设在这个三角形中集合Ai,j里存在数字k
那么,根据约束,所有在Ai,j的左上方的集合都必须包含数字k
显然不同的数字在三角形中的存在情形是可以分开讨论的
定义,对于数字k,称位置(i,j)为关键位置,当满足k ∈ Ai,j且Ai,j右下方(不包括Ai,j)所有集合不存在k
对于每种合法的关键位置摆放,关键位置在集合中的位置是严格往右上方走的
显然,一个三角形中每种数字的摆放可以用唯一的关键位置集确定
类似dp地手推K比较小的情况,任意一个数字合法关键位置集的大小恰好为2^K
因此总答案就是2^K^N了,写个快速幂就行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
typedef long long LL;
const LL mo = 1000000007;
 
int N,K;
 
int Mul(const LL &x,const LL &y) {return x * y % mo;}
 
int ksm(int x,int y)
{
    int ret = 1;
    for (; y; y >>= 1)
    {
        if (y & 1) ret = Mul(ret,x);
        x = Mul(x,x);
    }
    return ret;
}
 
int main()
{
    #ifdef DMC
        freopen("DMC.txt","r",stdin);
    #endif
     
    cin >> N >> K;
    cout << ksm(ksm(2,K),N) << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值