hdu 4602 Partition
生活随笔
收集整理的這篇文章主要介紹了
hdu 4602 Partition
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:將一個整數(shù) n 進(jìn)行無序拆分,一共有2^(n-1)種;輸入一個整數(shù) k ,問 k 在所有拆分中出現(xiàn)的次數(shù)。
分析:a[n][k]=a[i][k]+2^(n-k-1);(k<=i<n)
通過歸納法得到 a[n][k]=2*a[n-1][k]+2^(n-3);(n>=3),而對所有的 k 都有a[k][k]=1,a[k+1][k]=2,........
所以數(shù)組a的值與第二維k無關(guān)。那么 a[k]=1,a[k+1]=2,...;令n=n-k+1;即可以表示為 a[1]=1,a[2]=2,...a[n]=2*a[n-1]+2^(n-3)。
最終得到 a[n]=2^(n-1)+(n-2)*2^(n-3);將n=n-k+1代入得:a[n-k+1]=2^(n-k)+(n-k-1)*2^(n-k-2)
// Time 78ms; Memory 332K #include<iostream> #include<cstdio> using namespace std; const int inf=1000000000+7; long long pow(int n) {long long q=1,p=2;while(n){if(n%2) q=(q*p)%inf;n/=2;p=(p*p)%inf;}return q; } int main() {int t,n,k;long long sum;scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);if(n<k) sum=0;else if(n-k+1==1) sum=1;else if(n-k+1==2) sum=2;else sum=(pow(n-k)+((n-k-1)*pow(n-k-2))%inf)%inf;cout<<sum<<endl;}return 0; }?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangu66/p/3221533.html
總結(jié)
以上是生活随笔為你收集整理的hdu 4602 Partition的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桌面图标有阴影怎么去掉
- 下一篇: DHTML【1】