當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JZOJ 4058. 【JSOI2015】子集选取
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 4058. 【JSOI2015】子集选取
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
Input
Output
Sample Input
輸入1:
2 2
輸入2:
6 40
Sample Output
輸出1:
16
輸出2:
401898087
Data Constraint
Solution
設(shè) f(n,k) 為輸入為 n,k 的答案。
由于對于每一個元素,選取過程都是獨(dú)立的,
即元素 i 不會影響元素 j 的選取
那么可以得到 f(n,k)=f(1,k)n 。
下面來推導(dǎo) f(1,k) 。單個元素的選取的特點(diǎn)是:
選取 1 的位置是連續(xù)的,并會形成階梯狀。
如下圖:(當(dāng) k=6的情況:深色的是被選取的部分)
設(shè) Ai 為第 i 列最后選取的行是什么。若從第 1 列到第 m 列均存在格子被選取,
那么將滿足:
Ai+1≤Ai(1≤i≤m)設(shè) Gi,j 表示在第 i 列最后選取的是第 j 行的方案數(shù),那么得到遞推式:
Gi,j=∑p=jkGi?1,p觀察可得:
Gi,j=Gi?1,j+Gi,j+1推導(dǎo)一下會發(fā)現(xiàn)這是組合數(shù)的形式!
由于元素可以一個也不選,也可以在任意位置結(jié)束,所以:
f(1,k)=1+∑Gi,j=2k綜合可得:
f(n,k)=2n?k則時間復(fù)雜度為 O(logn) !
Code
#include<cstdio> using namespace std; const int mo=1e9+7; int n,k; inline long long ksm(long long x,int y) {long long s=1;while(y){if(y&1) s=s*x%mo;x=x*x%mo;y>>=1;}return s; } int main() {scanf("%d%d",&n,&k);printf("%lld",ksm(ksm(2,k),n));return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 4058. 【JSOI2015】子集选取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3693. 【NOI2014模
- 下一篇: JZOJ 4061. 【JSOI2015