算不出的算式题解

题目来源:[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 321
5 564
7 7129
11 113025

发现公式了吗?
当p==q时,总和还要加上(q-1)/ 2
最后,终于做好了AC AC ACACAC 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.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值