HDU 4602 - Partition

原题见:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106940#problem/A

 

题目要求:按题意找出对应数字出现的次数。

  4=1+1+1+1
  4=1+1+2
  4=1+2+1
  4=2+1+1
  4=1+3
  4=2+2
  4=3+1
  4=4               例如此例:1出现的次数为12。

 

 

代码如下:

 1 #include <stdio.h>
 2 
 3 typedef long long ll;
 4 ll mod=1e9+7;
 5 //#include <stdlib.h>
 6 ll qpow(ll n,ll m)
 7 {
 8     ll ans = 1;
 9     while(m>0)
10     {
11         if(m&1) ans = ans * n % mod;
12         n = n * n % mod;
13         m = m >> 1; 
14     }
15     return ans;
16 } 
17 /*ll fun(ll n,ll k)
18 {
19     if(n==k)  return 1;
20     else if(n==k+1) return 2;
21     else if(n-2 == k) return 5;
22     //else if(n-3 == k)return 12;
23     else return 2*fun(n-1,k)+qpow(2,n-3); 
24 }*/
25 int main()
26 {
27     int t;
28     ll ans,n,k;
29     scanf("%d",&t);
30     while(t--)
31     {
32         scanf("%lld%lld",&n,&k);
33         if(k>n) {  
34             printf("0\n");  
35             continue;  
36         }  
37         else 
38         {  
39             //printf("%lld\n",fun(n,k));  
40             ans=2*qpow(2,n-k-1)%mod+(n-k-1)*qpow(2,n-k-2)%mod;
41             printf("%lld\n",ans%mod);
42         }          
43     }
44     
45      
46     return 0;
47 }

找规律即可,例如将5的实例也写出后数数=,=会发现

n=%d 1     2    3    4    5

k=1    1     2    5   12  28

k=2    0     1    2    5   12

k=3    0     0    1    2    5

k=4    0     0    0    1    2

k=5    0     0    0    0    1

 

找到规律吧少年~~~~f(n)=2*f(n-1)+pow(2,n-3)或者ans=2*pow(2,n-k-1)%mod+(n-k-1)*pow(2,n-k-2)%mod

也就是说注释的部分也是对的,那为什么会变成注释呢?  =。=因为递归层数太多,导致本宝的程序MLT……!!空间超限。。。生平第一次啊。。。。然后就沦为注释。。。

嗯,就这样吧!

你可能感兴趣的:(HDU 4602 - Partition)