4475: [Jsoi2015]子集选取

4475: [Jsoi2015]子集选取

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

Description

4475: [Jsoi2015]子集选取_第1张图片

Input

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

Output

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

Sample Input

2 2

Sample Output

16

HINT

Source

By 佚名上传

[ 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
#include
#include
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;
}

你可能感兴趣的:(数学题)