CSU-ACM2017暑期训练3-递推与递归I

来源:互联网 发布:python and 编辑:程序博客网 时间:2024/06/05 15:11

大意自己看题。

一开始发呆好久相处了怎么求某时刻第i排的数量,结果a,b<=2^30超时,很烦。题解原来直接求出1到i排的个数,f(k,b)-f(k,a-1)。以后看到求区间一定要想到前缀和相减。

#include<cstdio>#include<cstring>#define maxl 33long long c(int k){long long sum=1;while(k--)sum*=3;return sum;}long long f(int k,int i){if(i==0) return 0;if(k==0) return 1; //边界处理很重要 int num=1<<(k-1);if(i<num) return 2*f(k-1,i);  //在上半边 ,从k-1到k会翻倍 elsereturn 2*c(k-1)+f(k-1,i-num); //在下半边 ,则上面一半变2个,下面的则等于i-1<<(k-1) }int main(){int a,b,t;long long k,sum=0,suma,sumb;scanf("%d",&t);for(int i=1;i<=t;i++){suma=0;sumb=0;scanf("%d%d%d",&k,&a,&b);sumb=f(k,b);suma=f(k,a-1);printf("Case %d: %lld\n",i,sumb-suma);}return 0;} 



原创粉丝点击