Uva Erratic Expansion

本文提供了解决UVA在线评测题4352号的方法,通过分析红块分布规律,计算特定小时后A到B行的红块总数。涉及2进制转换、幂运算等基本数学概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处__谢谢! http://blog.youkuaiyun.com/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;
}

 

 

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值