前言
https://www.luogu.com.cn/problem/P9373
与其编写苍白无力的背景,不如写有质量的题解。
阅读理解
给定两个非负整数 n , k n,k n,k, 求一组非负整数 ( x , y ) (x,y) (x,y), 使得 x + y = n ∧ x m o d y = k x + y = n\ \land\ x \bmod y =k x+y=n ∧ xmody=k。
其中
∧
\land
∧ 是并且, 相当于 C++
中的 &&
;
m
o
d
\bmod
mod 是取余的意思, 相当于 %
。
思路历程 ( 20 20 20 pts)
我们先这样写:
x = { x + y = n , x m o d y = k . x = \begin{cases} x+y=n\ , & \\ x\ \bmod \ y=k.& \end{cases} x={x+y=n ,x mod y=k.
可得
y
=
n
−
x
y=n-x
y=n−x
代入得
x m o d ( n − x ) = k x \ \bmod \ (n-x)=k x mod (n−x)=k
然后枚举 x x x。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long int n,k;
cin>>n>>k;
bool b=true;
for(long long int i=0;i<n;i++)
if(i%(n-i)==k){
cout<<i<<" "<<n-i<<endl;
b=false;
break;
}
if(b)
cout<<-1<<endl;
}
return 0;
}
Tips:
- 枚举 x x x 的时候需要注意 x x x 的范围 [ 0 , n ) [0,n) [0,n), 注意: 不包括 n n n,以为 x = n , y = 0 x=n, y=0 x=n,y=0, 取余时会 RE.
时间复杂度为 O ( T n ) \mathcal{O}(Tn) O(Tn) 的。无法通过。
思路历程 ( 100 100 100 pts )
刚才我们的结果是
x m o d ( n − x ) = k x \ \bmod \ (n-x)=k x mod (n−x)=k
我没有学过数论,这么复杂我没法再做了……
于是我们尝试另外一种思路。
假设 a = ⌊ x y ⌋ a=\lfloor \dfrac {x}{y} \rfloor a=⌊yx⌋。
那么根据 商 × 除数 + 余数 = 被除数 \text{商} \times \text{除数} + \text{余数} = \text{被除数} 商×除数+余数=被除数 可得
x = a y + k x= ay+k x=ay+k
同样用代入法,可得
n = a y + k + y n=ay+k+y n=ay+k+y
即
n − k = ( a + 1 ) ⋅ y n-k=(a+1) \cdot y n−k=(a+1)⋅y
那么假设 a = 0 a=0 a=0,则
y = n − k y=n-k y=n−k
易求得
{ x = k , y = n − k . \begin{cases}x=k \ ,& \\ y=n-k \ .\end{cases} {x=k ,y=n−k .
∴, 我们成功的用表达式求出了 ( x , y ) (x,y) (x,y)!
于是我高高兴兴地写完了代码。
核心代码:
while(t--){int n=readint(),k=readint();cout<<k<<" "<<n-k<<endl; //关键}
代码详见 https://kgithub.com/mahaoming2022/OI-Code/blob/main/code-P9373.md (太长了……套了自己的模板)
这份代码的提交结果十分funny!
-
https://www.luogu.com.cn/record/111535537 (开了 O2 \text{O2} O2 优化)
原因是啥呢?
余数必须比除数小!!!
即 k < y k < y k<y。
是不是想起来了?
好,我们加一个判断。
代码详见 https://kgithub.com/mahaoming2022/OI-Code/blob/main/code-P9373.md
提交记录 :https://www.luogu.com.cn/record/111535077
总结、提示、额外说明
- 代入消元法
- 余数比除数大见祖宗!
- 不开
long long
见祖宗!
其实还有一种代码,就是枚举 x , y x,y x,y 这个应该一分没有。 qwq……
后记
本文所有代码详见 https://kgithub.com/mahaoming2022/lib/blob/main/code-P9373.md
蒟蒻的第一篇题解,感谢支持!