构造与取模
题目描述
对于整数 \(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;
}