Goffi and Squary Partition
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
Recently, Goffi is interested in squary partition of integers.
A set X of k distinct positive integers is called squary partition of n if and only if it satisfies the following conditions:
[ol]
A set X of k distinct positive integers is called squary partition of n if and only if it satisfies the following conditions:
[ol]
- the sum of
k
positive integers is equal to
n
- one of the subsets of
X
containing
k−1
numbers sums up to a square of integer.[/ol]
For example, a set {1, 5, 6, 10} is a squary partition of 22 because 1 + 5 + 6 + 10 = 22 and 1 + 5 + 10 = 16 = 4 × 4.
Goffi wants to know, for some integers n and k , whether there exists a squary partition of n to k distinct positive integers.
Input
Input contains multiple test cases (less than 10000). For each test case, there's one line containing two integers
n
and
k
(
2≤n≤200000,2≤k≤30
).
Output
For each case, if there exists a squary partition of
n
to
k
distinct positive integers, output "YES" in a line. Otherwise, output "NO".
Sample Input
2 2 4 2 22 4
Sample Output
NO YES YES
题意:将一个数n分成k个不同的数字,其中存在k-1个数字的和为平方数。如果存在输出YES,不存在输出NO。
题解:从1开始遍历平方数即可,然后判断该平方数是否符合情况。
如何判断:sum为前k-1个数的和,square为要判断的平方数,need为第k个数。
如果sum > square,说明最小的k-1个数的组合都比这个平方数大,不满足;
如果need <= k - 1 && sum + k > n,即第k个数在前k-1个数中,那么这k个数的最小和大于n时,不满足;
如果need == k && square - sum == 1,即第k个数是k,并且前k-1个数的和比平方数小1,此时必然会用到k这个数,所以重复,不满足。
代码:
#include <stdio.h>
#include <string.h>
int a[1000], tol;
bool judge(int square, int n, int k){
int sum = k * (k - 1) / 2;
int need = n - square;
if(sum > square)
return false;
if(need <= k - 1 && sum + k > n)
return false;
if(need == k && square - sum == 1)
return false;
return true;
}
bool solve(int n, int k){
for(int i = 0; i < tol && a[i] < n; i++){
if(judge(a[i], n, k))
return true;
}
return false;
}
int main(){
int n, k;
tol = 0;
for(int i = 1; i*i < 200005; i++)
a[tol++] = i * i;
while(~scanf("%d%d", &n, &k)){
bool flag = solve(n, k);
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}