zoukankan      html  css  js  c++  java
  • 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;
    
          }
    
    
       }
    
    }
    


  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3247202.html
Copyright © 2011-2022 走看看