CCPC-Wannafly Winter Camp Day1 (Div2, onsite) 拆拆拆数

题目描述

读入AA和BB,wlswls想请你把AA拆成a_1, a_2, ..., a_na1​,a2​,...,an​,把BB拆成b_1, b_2, ..., b_nb1​,b2​,...,bn​,满足

  1. 对于所有的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

  2. \sum_{i=1}^{n}{a_i} = A∑i=1n​ai​=A,\sum_{i=1}^{n}{b_i} = B∑i=1n​bi​=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;
}

猜你喜欢

转载自blog.csdn.net/wzazzy/article/details/86649007