[BJOI2012]算不出的等式 题解

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

背景:
曾经有一个老掉牙的游戏放在我面前,我没有珍惜。直到这个游戏停产才追悔莫及。人世间最痛苦的事情莫过于此,如果上天给我一个再玩一次的机会,我一定要,通关!
题目描述:
如果你真的很想玩这个游戏,那么就先看看我的题目吧,搞不定这些的话是没办法通关的哟。第一关其实很简单,只有一个关闭的有密码锁的大门。这大门上写着一个奇怪的算式,估计是要你利用它算出密码来开门吧(果然是老掉牙的情节)。
传说中这个式子中的p和q是两个奇质数,等号右边算出来应该就是密码了吧,你是真的算不出来么?
[BJOI2012]算不出的等式 题解
输入
只有一行,两个奇质数,分别表示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循环来解决这一道题
然而~~~~~

[BJOI2012]算不出的等式 题解
TLE

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

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

[BJOI2012]算不出的等式 题解
由于是向下取整,所以,你会发现一个公式:这些的和就是这个这个长方形的面积,而且,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;
}

然后测评出结果:
[BJOI2012]算不出的等式 题解
没错,错误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;
}

[BJOI2012]算不出的等式 题解
END.

上一篇:[题解]CF1534F1 Falling Sand (Easy Version)


下一篇:[BJOI2012]最多的方案