[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时,由于重合,所以重合的点还要加上 ,也就是说,总和还要加上(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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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工具