hdu 4602 Partition

題意:將一個整數 n 進行無序拆分,一共有2^(n-1)種;輸入一個整數 k ,問 k 在全部拆分中出現的次數。ios

分析: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,........spa

因此數組a的值與第二維k無關。那麼 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)。code

最終獲得 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)io

// 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;
}
相關文章
相關標籤/搜索