CF1327A Sum of Odd Integers 题解
简要题意:
多组数据,问能否把 \(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 \times 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;
}
简易的代码胜过复杂的说教。