E-Puzzle: Square Jam
题意
将n*m的矩阵分成若干个正方形部分,要求矩形的每个整点不能同时处于正方形顶点
题意:
每次取出的正方形边长为矩阵长宽中较小者
例如:3*4
第一次选出正方形3×3。剩余1×4
再选出正方形1×1。剩余1×3
选出11,剩余1×2
选出11,剩余1×1
选出1×1。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N=2e5+10;
struct node
{
int x,y,d;
}st[N];
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void solve()
{
int x,y;
x=read();
y=read();
int mx=max(x,y);
int mn=min(x,y);
int xx=0,yy=0;
int ans=0,cnt=0;
while(1)
{
int a=mx/mn;
int b=mx%mn;
ans+=a;
while(a--)
{
st[cnt].x=xx;
st[cnt].y=yy;
st[cnt].d=mn;
cnt++;
if(xx+mn>=x) yy+=mn;
else xx+=mn;
}
if(b==0) break;
mx=mn;
mn=b;
}
printf("YES\n%d\n",ans);
for(int i=0;i<ans;i++) printf("%d %d %d\n",st[i].x,st[i].y,st[i].d);
}
signed main()
{
int t;
t=read();
while(t--)
{
solve();
}
return 0;
}