简要题意:
多组数据,问能否把 (n) 分为 (k) 个 不同的 正奇数之和。
盲猜数学结论题。
只要考虑两个问题:
-
(n) 的大小是否足够。
-
(n) 的奇偶性是否满足。
对于第 (1) 条,最小的 (k) 个 不同的 正奇数之和为 (k^2).(这都不知道,建议重学小学数学)
所以,(n geq k^2) 才可能有解。
对于第 (2) 条,因为 (k) 个正奇数与 (k) 的奇偶性相同,所以必须满足:
[n equiv k pmod 2
]
这两条同时满足即有解,否则无解。
为什么呢?
考虑一种拆分:
[1 + 3 + 5 + ... + (2k-3) + p = n
]
即前 (k-1) 个正奇数加上另一个奇数。
如果 (n) 同时满足上两条,则显然存在这样的拆分,且 (p geq 2 imes k - 1),也不存在重复。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int main(){
ll T=read(),n,k; while(T--) {
n=read(),k=read();
if(n<k*k || (n-k)&1) puts("NO");
else puts("YES");
} //别忘了,k*k会爆int,开上 long long
return 0;
}