连接: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出现两次,所以不用怕出现重复的情况。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 #define N 1000000007 7 #define LL __int64 8 LL mods(LL a,LL b,LL n) 9 { 10 LL ret=1; 11 LL tmp=a; 12 while(b) 13 { 14 if(b&0x1) ret=(ret*tmp)%n; 15 tmp=(tmp*tmp)%n; 16 b>>=1; 17 } 18 return ret; 19 } 20 int main() 21 { 22 LL n,k,T; 23 //freopen("data.in","r",stdin); 24 // freopen("data.out","w",stdout); 25 cin>>T; 26 while(T--) 27 { 28 scanf("%I64d%I64d",&n,&k); 29 if(k > n) 30 { 31 printf("0 "); 32 } 33 else 34 { 35 36 LL ans = 0; 37 ans = mods(2,n-k,N); 38 if(n-k-1 >= 1) 39 ans += mods(2,n-k-2,N)*(n-k-1); 40 ans %= N; 41 printf("%I64d ",ans); 42 } 43 44 } 45 return 0; 46 }