转载请注明出处__谢谢! http://blog.csdn.net/huiyuan_ai?viewmode=contents by---huiyuan_ai第一次写这个东东,不好的地方还请提出,另求认识大神(ˇ^ˇ),目前只会水题- -#~~~!
题意:求k小时后A到B行的红块数!
题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4352
这题可以从下往上看A-B行的红块数等于A到(pow(2.0,k)-a+1)红块数-(pow(2.0,k)-b)红块数
然后发现红最后A行用2进制表示可以通过这个求出红块数
for(i=k,j=0;i>=0;i--)
{if(bina[i])
{sa+=(LL)pow(3.0,i)*(LL)pow(2.0,j);
j++;}
}
应为11(2)=1011
比如最后11行的红块数等于最后8(2^3)行*2.0^0的+最后2(2^1)行2.0^1+最后1(2^0)行*2.0^2的红块数
又应为8行的红块数是4行的3倍是2行的9倍是1行的27倍所以用pow(3.0,i)表示
这题当时没有做出来,当时从上面往下看的,看的头都大了,主要还是太弱了!
#include <stdio.h>
#include <math.h>
#include <string.h>
#define LL long long
int bina[100],binb[100];
int main(){
int i,j,k,t,la,lb,cas=1;
LL l,sa,sb,a,b;
scanf("%d",&t);
while(t--){
memset(bina,0,sizeof bina);
memset(binb,0,sizeof binb);
scanf("%d%lld%lld",&k,&a,&b);
l=(int)pow(2.0,k);
a=l-a+1;
b=l-b;
la=0;
lb=0;
while(a){
bina[la++]=a%2;
a>>=1;
}
while(b){
binb[lb++]=b%2;
b>>=1;
}
sa=0;
sb=0;
for(i=k,j=0;i>=0;i--){
if(bina[i]){
sa+=(LL)pow(3.0,i)*(LL)pow(2.0,j);
j++;
}
}
for(i=k,j=0;i>=0;i--){
if(binb[i]){
sb+=(LL)pow(3.0,i)*(LL)pow(2.0,j);
j++;
}
}
printf("Case %d: ",cas++);
printf("%lld\n",sa-sb);
}
return 0;
}