构造与取模

构造与取模 洛谷

题目描述

对于整数 \(n,k\),若存在非负整数 \(x\)正整数 \(y\) 满足:

\[x + y = n\ \land\ x \bmod y =k \]

则我们称有序数对 \((x,y)\)\(n\) 的一个 优秀拆分(其中 \(\land\)并且的意思)。

现给定非负整数 \(n,k\),请你构造任意一组 \(n\) 的优秀拆分,并分别输出你构造方案中的 \(x\)\(y\)。特殊地,若不存在这样的拆分,则输出 -1


输入格式

本题有多组数据。

第一行一个正整数 \(T\),表示数据组数。

接下来 \(T\) 行,每行两个非负整数,分别为 \(n,k\)


输出格式

输出共 \(T\) 行,第 \(i\) 行表示第 \(i\) 组数据的答案。


样例输入

3
1 0
13 3
198818800000 122122200000

样例输出

0 1
8 5
-1

提示

对于 \(100\%\) 的数据:\(T \leq 5\)\(0 \leq n,k \leq 10^{18}\)


因为 \(x\bmod y=k\) ,便可以得到 \(x=dy+k\)

代入第一个式子,便有 \(dy+k+y=n\) ,化简可得 \((d+1)y=n-k\)

\(d=0\) ,则 \(y=n-k,x=k\) ,满足条件

那什么时候无解呢

因为 \(x \bmod y=k\) ,而且 \(x=k\) ,那么要是 \(y\)\(x\) 还要小,则取模后必定小于 \(k\) ,不满足条件,也就是无解

化简一下,若 \(n-k< k\) ,则式子无解

\(Code:\)

#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
	int t;scanf("%lld",&t);
	while(t--){
		int n,k;scanf("%lld%lld",&n,&k);
		if(n-k<=k) printf("-1\n");
		else printf("%lld %lld\n",k,n-k);
	}
	return 0;
}
posted @ 2023-06-14 09:31  HEIMOFA  阅读(13)  评论(0)    收藏  举报