题解:P11063 【MX-X4-T3】「Jason-1」数对变换
Lele_Programmer · · 题解
P11063 题解
思路
如果
考虑
if (a*b==d*c) {
printf("2\n");
printf("%lld %lld\n",1,a);
printf("%lld %lld\n",2,c);
continue;
}
这样一来,便可以获得子任务 2 的部分分。
接下来考虑
因此得出一个结论,若
然后就要考虑如何将
为了方便,先进行类型 2,
由于向下取整,那么进行变换后
不难证明,对于任意
所以,每一次,我们取
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;
int T;
int a,b,c,d;
vector<pii> ans;
signed main() {
scanf("%lld",&T);
while (T--) {
scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
if (a*b==d*c) {
printf("2\n");
printf("%lld %lld\n",1,a);
printf("%lld %lld\n",2,c);
continue;
} else if (a==c && b==d) {
puts("0");
continue;
} else if (a*b<c*d) {
puts("-1");
continue;
}
ans.clear();
ans.push_back({2,b});
a*=b,b/=b;
int bias=a*b-c*d;
bool ok=true;
while (bias) {
// cout<<bias<<" "<<a-bias<<" "<<b-bias<<endl;
if (a==1) {
int k=b/2+1;
k=max(k,b-bias);
ans.push_back({2,k});
if (b-k==0) {
ok=false;
break;
}
bias-=b-k;
b/=k,a*=k;
} else {
int k=a/2+1;
k=max(k,a-bias);
ans.push_back({1,k});
if (a-k==0) {
ok=false;
break;
}
bias-=a-k;
a/=k,b*=k;
}
}
if (!ok) {
puts("-1");
continue;
}
ans.push_back({1,a});
ans.push_back({2,c});
printf("%lld\n",ans.size());
_iter(it,ans) printf("%lld %lld\n",it->first,it->second);
}
return 0;
}
/*
1
80 43 52 64
*/
/*
1
987654321 123456789 313814116 388538872
*/