zoukankan      html  css  js  c++  java
  • hdu 4602 Partition

    题意:将一个整数 n 进行无序拆分,一共有2^(n-1)种;输入一个整数 k ,问 k 在所有拆分中出现的次数。

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

    所以数组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)。

    最终得到 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;
    }
    

  • 相关阅读:
    基于http实现网络yum源搭建
    基于长轮询简易版聊天室
    放大镜案例
    弹出登录框
    拖拽案例
    js入门之DOM动态创建数据
    heoi2020游记
    省选模拟6&7
    省选模拟5
    后缀自动机总结
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218165.html
Copyright © 2011-2022 走看看