P9373题解

前言

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=nx

代入得

x     m o d     ( n − x ) = k x \ \bmod \ (n-x)=k x mod (nx)=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 (nx)=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 nk=(a+1)y

那么假设 a = 0 a=0 a=0,则

y = n − k y=n-k y=nk

易求得

{ x = k   , y = n − k   . \begin{cases}x=k \ ,& \\ y=n-k \ .\end{cases} {x=k ,y=nk .

∴, 我们成功的用表达式求出了 ( 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!

原因是啥呢?

余数必须比除数小!!!

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

蒟蒻的第一篇题解,感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值