原题见: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 "); 35 continue; 36 } 37 else 38 { 39 //printf("%lld ",fun(n,k)); 40 ans=2*qpow(2,n-k-1)%mod+(n-k-1)*qpow(2,n-k-2)%mod; 41 printf("%lld ",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……!!空间超限。。。生平第一次啊。。。。然后就沦为注释。。。
嗯,就这样吧!