[BJOI2012]算不出的等式 题解

题目来源:[Beijing wc2012];
原题网址:https://www.lydsy.com/JudgeOnline/problem.php?id=2659
bzoj P2659
附原题:
题目描述

背景:
曾经有一个老掉牙的游戏放在我面前,我没有珍惜。直到这个游戏停产才追悔莫及。人世间最痛苦的事情莫过于此,如果上天给我一个再玩一次的机会,我一定要,通关!
题目描述:
如果你真的很想玩这个游戏,那么就先看看我的题目吧,搞不定这些的话是没办法通关的哟。第一关其实很简单,只有一个关闭的有密码锁的大门。这大门上写着一个奇怪的算式,估计是要你利用它算出密码来开门吧(果然是老掉牙的情节)。
传说中这个式子中的p和q是两个奇质数,等号右边算出来应该就是密码了吧,你是真的算不出来么?
在这里插入图片描述
输入
只有一行,两个奇质数,分别表示p,q。
输出
一个数,表示算式结果。
样例输入
5 7
样例输出
6
提示
HINT:p,q在32位整型范围内。

题解内容

首先,要来看一看题目,题目比较简单的,但是,这是一到数学题
不多说,0.1版本TLE代码

#include<cstdio>
using namespace std;
int s,p,q;
int main(){
scanf("%d%d",&p,&q);
for(int i=1;i<=(p-1)>>1;i++)
s+=i*q/p;
for(int i=1;i<=(q-1)>>1;i++)
s+=i*p/q;
printf("%d",s);
return 0;
}

简单的for循环来解决这一道题
然而~~~~~

在这里插入图片描述
TLE

分析原因:这是在int范围内的,int的范围是2147483648,直接爆掉

然后,由于是数学题,所以,只要把公式推出来就是了,但是推公式有这么简单吗???因为有向下取整,所以,就是一道数论题了
首先呢,就是想到数学老师的数形结合,献上图片:

在这里插入图片描述
由于是向下取整,所以,你会发现一个公式:这些的和就是这个这个长方形的面积,而且,q,p都是质数,所以,所有的点都不会与方格的角重合,这样,就可以使用公式了。即为 (q-1)*(p-1)/4
推出结果后,就可以把0.2版WA代码推出来了。
代码如下:

#include<cstdio>
using namespace std;
long long p,q;
int main(){
scanf("%d%d",&p,&q);
printf("%lld",(p-1)/2*(q-1)/2);
return 0;
}

然后测评出结果:
在这里插入图片描述
没错,错误10%,也就是说,这个公式并不能推出所有状态的,来一组反例:(当q==p的时候,上图的线就会与方格的顶点重合了)
样例输入
3 3
样例输出
2
实际输出
1
进行多次的推理后,我们发现当q=p的时候,我们的公式不管用了。
在看一些输入:

样例输入 样例输出 实际输出
3 3 2 1
5 5 6 4
7 7 12 9
11 11 30 25
发现公式了吗?
当p==q时,由于重合,所以重合的点还要加上 1 ,也就是说,总和还要加上(q-1)/ 2
最后,终于做好了AC代码
献上代码:
#include<cstdio>
using namespace std;
long long p,q;
int main(){
scanf("%d%d",&p,&q);
if(q==p)printf("%lld",(p-1)*(q-1)/4+(p-1)/2);
else
printf("%lld\n",(p-1)*(q-1)/4);
return 0;
}

在这里插入图片描述
END.

posted @   jiangtaizhe001  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示