T3 分拆 题解
upd:修改了一处笔误,感谢 TheShadow 指出。请管理重新审核。
#include<cstdio>
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define Set(a) memset(a,0,sizeof(a))
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define openf(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define re register
#define ri re int
#define il inline
typedef long long ll;
typedef unsigned long long ull;
template<typename T> inline T rd(T& x)
{
T f=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(T)(c-'0');
x*=f;
return x;
}
ll rd(){ll x;rd(x);return x;}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
const int inf=1<<30;
void out(int n)
{
if(n%4==1)
{
puts("YES");
if(n==1) printf("1\n1 1\n");
else printf("3\n1 %d\n%d 1\n%d -1\n",n,n/2,n/2);
}
else if(n%4==2) puts("NO");
else if(n%4==3) puts("NO");
else
{
if(n%8==0)
{
puts("YES");
printf("4\n1 %d\n1 2\n%d 1\n%d -1\n",n/2,n-n/4-2,n/4);
}
else
{
if(n==4) puts("NO");
else
{
puts("YES");
printf("4\n1 %d\n1 -2\n%d -1\n%d 1\n",n/2,n/4-2,n-n/4);
}
}
}
}
int main()
{
int T=rd();
while(T--) out(rd());
return 0;
}