前言:
比赛的时候想出了三种做法,暴力,二分还有数学。额,实测暴力70pts
,二分100pts
,数学100pts
。但是比赛的时候这道题还是保龄了(我才不会告诉你我,在这写下题解算是警戒和纪念吧(freopen
调试的时候加的注释没有删掉呢纪念保龄。这里介绍暴力,二分,数学三种做法,不过二分的代码我给删了,先放一下其他大佬的代码吧(当然是照着敲一遍的,我才懒得找人家说明情况
题目:
Luogu:Link
简要:
给定一个正整数 k k k,有 k k k 次询问,每次给定三个正整数 n i , e i , d i n_i, e_i, d_i ni,ei,di,求两个正整数 p i , q i p_i, q_i pi,qi,使 n i = p i × q i n_i = p_i \times q_i ni=pi×qi、 e i × d i = ( p i − 1 ) ( q i − 1 ) + 1 e_i \times d_i = (p_i - 1)(q_i - 1) + 1 ei×di=(pi−1)(qi−1)+1。
输入格式
第一行一个正整数 k k k,表示有 k k k 次询问。
接下来 k k k 行,第 i i i 行三个正整数 n i , d i , e i n_i, d_i, e_i ni,di,ei。
输出格式
输出 k k k 行,每行两个正整数 p i , q i p_i, q_i pi,qi 表示答案。
为使输出统一,你应当保证 p i ≤ q i p_i \leq q_i pi≤qi。
如果无解,请输出 NO
。
样例输入 #1
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263
528 4 109
样例输出 #1
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
Step 1 暴力:
额,暴力做法非常简单,照着题意直接敲就好了。用两层For
循环分别枚举p
和q
的话肯定会T
得很惨,那么考虑优化。
我们不妨来看看p
和q
还必须满足什么条件(前置知识:整式的乘除)。
我们已知:
e i × d i = ( p i − 1 ) ( q i − 1 ) + 1 ; e_i \times d_i = (p_i - 1)(q_i - 1) + 1 ; ei×di=(pi−1)(qi−1)+1;
展开就是:
e i × d i = p i × q i − p i − q i + 1 + 1 ; e_i \times d_i = p_i \times q_i - p_i - q_i + 1 + 1 ; ei×di=pi×qi−pi−qi+1+1;
化简可得:
e i × d i = p i × q i − ( p i + q i ) + 2 ; e_i \times d_i = p_i \times q_i - (p_i + q_i) + 2 ; ei×di=pi×