4475: [Jsoi2015]子集选取

来源:互联网 发布:java concurrent书籍 编辑:程序博客网 时间:2024/06/05 07:46

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

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<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;}

0 0
原创粉丝点击