题目描述
读入AA和BB,wlswls想请你把AA拆成a_1, a_2, ..., a_na1,a2,...,an,把BB拆成b_1, b_2, ..., b_nb1,b2,...,bn,满足
-
对于所有的i(1 \leq i \leq n),a_i, b_i \geq 2i(1≤i≤n),ai,bi≥2 且 gcd(a_i, b_i) = 1gcd(ai,bi)=1
-
\sum_{i=1}^{n}{a_i} = A∑i=1nai=A,\sum_{i=1}^{n}{b_i} = B∑i=1nbi=B
如果有多组满足条件的aa和bb,请输出nn最小的任意一组即可。
如果无解,请输出-1−1。
输入描述
第一行一个整数testtest表示数据组数。
接下来testtest行,每行两个整数AA,BB。
1 \leq test \leq 1000001≤test≤100000
5 \leq A, B \leq 10^{18}5≤A,B≤1018
输出描述
对于每组数据,第一行输出一个整数nn;
接下来nn行每行输出两个整数a_iai,b_ibi表示答案。
样例输入 1
2
6 5
100000 100000
样例输出 1
1
6 5
2
49999 50001
50001 49999
首先明确一个结论,一定有解,并且n<=2
那么可以直接暴力
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a ,ll b){return b==0?a:gcd(b,a%b);}
const int maxn=20000;
int main()
{
int t;scanf("%d",&t);
while(t--)
{
ll a,b;scanf("%lld%lld",&a,&b);
int flag=0;
if(gcd(a,b)==1) printf("1\n%lld %lld\n",a,b);
else
{
for(int i=2;i<=5;i++)
{
for(int j=2;j<=5;j++)
{
if(gcd(i,j)==1&&gcd(a-i,b-j)==1)
{
flag=1;
printf("2\n%d %d\n%lld %lld\n",i,j,a-i,b-j);
break;
}
}
if(flag==1) break;
}
}
}
return 0;
}