hdu 4602 Partition 快速幂,构造递推关系 (13多校#1,1003)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4602

解题思路: 1设对n的分解中k出现的次数是 g(n,k) ,首先发现k从n往下举例的时候,前几项都是一样的(待证明)

                      然后只需要知道对n的划分中,一共有多少个数。 考虑将n分成k个数,有C(n-1,k-1)种分发,于是总个数就是sigma k*C(n-1,k-1) ;

                     2 利用kC(n,k)=n C(n-1,k-1)  很容易求和  ,找到了a(n)=sigma...- S(n-1) ;再列举一项相减就可以了。  最后得到a(n)=(2^(n-3)     ) *     (n+2),n>=3;

                     3 输入n,k  将n-k+1带入计算就可以了  ,注意特判n-k<0,==1,   几种情况。

                     4n,k比较大, 记得使用快速幂,还有使用long long保存结果;

#include<iostream>

using namespace std;

typedef long long inta;
inta quick_mod(inta a,int b,int m)
{
   inta ans=1;
   a=a%m;
   while(b>0)
  {
     if(b&1)
     {
        ans=(ans*a)%m;
     }
     b>>=1;
     a=(a*a)%m;
  }

  return ans;
}
int main()
{
   int size;
   cin>>size;
   int n,k;
   while(cin>>n>>k)
   {
      int temp=n-k;
 
       if(temp<0)  cout<<0<<endl;
      else if(temp==0)  cout<<1<<endl;
      else if(temp==1)
      {
        cout<<2<<endl;
      }
//      else if(temp==2)
//      {
//         cout<<5<<endl;
//      }
      else
      {
          inta ans=quick_mod(2,temp-2,1000000007);
          ans=(ans*(temp+3))%1000000007;

          cout<<ans<<endl;

      }


   }

}


posted @ 2013-07-25 23:25  814jingqi  阅读(141)  评论(0编辑  收藏  举报