P5681 [CSP-J2019 江西] 面积 题解

终于可以写一道如此复杂的题的题解了!


题目就是说, Alice 有一个边长为 \(a\) 正方形,所以她的大小应该是:

\[\large a^2 \]

而 Bob 有一个 \(b*c\) 的长方形,所以他的大小就应该是:

\[\large b*c \]

(小学的几何知识,应该都懂...)


乍一看,数据范围里面赫然写着:

对于 \(100\%\) 的数据, \(1\le a,b,c \le 10^9\)

\(10^9\) 那么大的数据,当然要用高精啦!

又一看, \(a^2\) ?,那就是赤裸裸的 高精+快速幂


话不多说,直接上代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct sd{
	int num[50];
	int len;
};	//用结构体存储高精,计算更加方便。 
sd a,b,c;
sd ans1,ans2;

sd mul(sd x,sd y)	//高精乘 
{
	sd res;
	memset(res.num,0,sizeof(res.num));
	for(int i=1;i<=x.len;i++)
	{
		int t=0;	//用于存放进位 
		for(int j=1;j<=y.len;j++)	//对乘数的每一项进行处理 
		{
			int p=i+j-1;
			res.num[p]+=x.num[i]*y.num[j]+t;	//原数 += (当前乘积 + 进位) 
			t=res.num[p]/10;
			res.num[p]%=10;
		}
		res.num[i+y.len]+=t;
	}
	res.len=x.len+y.len;
	while(res.num[res.len]==0&&res.len>1)
		res.len--;
	return res;
}
sd power(sd x,int y)	//高精快速幂函数 
{
	if(y==1) return x;
	if(y&1==1) return mul(power(mul(x,x),y>>1),x);
	else return power(mul(x,x),y>>1);
}
bool check(sd x,sd y)
{
	int maxlen=max(x.len,y.len);
	for(int i=maxlen;i>=1;i--)	//逐位比较大小 
	{
		if(x.num[i]>y.num[i]) return true;
		else if(x.num[i]<y.num[i]) return false;
	}
	return false;
}
int main()
{
	char sta[50],stb[50],stc[50];
	scanf("%s %s %s",sta,stb,stc);	//以字符串方式输入 
	int lena=strlen(sta);
	int lenb=strlen(stb);
	int lenc=strlen(stc);
	for(int i=0;i<lena;i++)
		a.num[lena-i]=sta[i]-'0';	//把字符串转成int数组 
	a.len=lena;
	for(int i=0;i<lenb;i++)
		b.num[lenb-i]=stb[i]-'0';	//同上 
	b.len=lenb;
	for(int i=0;i<lenc;i++)
		c.num[lenc-i]=stc[i]-'0';	//同上 
	c.len=lenc;
	ans1=power(a,2);	//即a^2 
	ans2=mul(b,c);		//即b*c 
	if(check(ans1,ans2)==true) printf("Alice\n");
	else printf("Bob\n");	//比较两个面积的大小 
	return 0;
}

代码可以AC,仅用时 2ms 。


2021-11-07 16:43 撰写于洛谷,2025-08-25 17:01 迁移至博客园。

注:这篇题解实际上并未通过审核,它是我看到题解区早就关闭后自娱自乐的产物。

posted @ 2025-08-25 17:02  Jerrycyx  阅读(11)  评论(0)    收藏  举报