您的位置:首页 > 其它

hdu 4602 Partition

2013-07-23 21:32 429 查看
连接:http://acm.hdu.edu.cn/showproblem.php?pid=4602

题目大意是给你一个数的N的加法构成中另外一个数k的出现次数。如

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次。

这题是赵鹏搞出来的。一个数N可以分成好N个块,如果说N= 5,K= 2 那么则会有(0|0|0|0|0)0|00|0这样的可以出现或者在边上的情况00|或者|00,才能保证有00会出现,因为122中2出现两次,所以不用怕出现重复的情况。

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1000000007
#define LL __int64
LL mods(LL  a,LL b,LL  n)
{
LL ret=1;
LL tmp=a;
while(b)
{
if(b&0x1) ret=(ret*tmp)%n;
tmp=(tmp*tmp)%n;
b>>=1;
}
return ret;
}
int main()
{
LL  n,k,T;
//freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
cin>>T;
while(T--)
{
scanf("%I64d%I64d",&n,&k);
if(k > n)
{
printf("0\n");
}
else
{

LL ans = 0;
ans = mods(2,n-k,N);
if(n-k-1 >= 1)
ans += mods(2,n-k-2,N)*(n-k-1);
ans %= N;
printf("%I64d\n",ans);
}

}
return 0;
}


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