您的位置:首页 > 其它

HDU 4602 - Partition

2016-02-19 17:16 274 查看
原题见: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。

代码如下:

#include <stdio.h>

typedef long long ll;
ll mod=1e9+7;
//#include <stdlib.h>
ll qpow(ll n,ll m)
{
ll ans = 1;
while(m>0)
{
if(m&1) ans = ans * n % mod;
n = n * n % mod;
m = m >> 1;
}
return ans;
}
/*ll fun(ll n,ll k)
{
if(n==k)  return 1;
else if(n==k+1) return 2;
else if(n-2 == k) return 5;
//else if(n-3 == k)return 12;
else return 2*fun(n-1,k)+qpow(2,n-3);
}*/
int main()
{
int t;
ll ans,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
if(k>n) {
printf("0\n");
continue;
}
else
{
//printf("%lld\n",fun(n,k));
ans=2*qpow(2,n-k-1)%mod+(n-k-1)*qpow(2,n-k-2)%mod;
printf("%lld\n",ans%mod);
}
}

return 0;
}


找规律即可,例如将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……!!空间超限。。。生平第一次啊。。。。然后就沦为注释。。。

嗯,就这样吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: