Goffi and Squary Partition
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18 Accepted Submission(s): 12
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:
- 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.
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
题意:构造k个数,使得总和为n,且存在k-1个数的总和为一个完全平方数,能构造输出YES,否则输出NO
思路:贪心,先找到小于n且最接近n的完全平方数x,然后构造前k-1个数使得总和为x,那么第k个数固定为y=n-x
做到这里就可以分情况讨论了
1. y不等于1~k-1里的数,如果 y 不等于 k 则有解,如果 y=k ,如果x-k*(k-1)/2=1,则无解,否则有解
2. y等于1~k-1里的数,显然y不可能等于k了,则将1~k-1里等于y的数替换为k即可,只要前k-1个数的总和<=x则有解,否则无解
#include
#include
#include
#include
#include
using namespace std; int a[460]; int main() { int n,k; int i; int d=0; for(i=1;i*i<=200000;i++)a[d++]=i*i; while(scanf("%d%d",&n,&k)!=EOF) { int y; int ok=0; for(i=0;i
=n)break; i--; int total=a[i]; y=n-total; if(y<1)printf("NO\n"); else{ int sum=0; for(i=1;i<=k-1;i++){ if(i!=y)sum+=i; else sum+=k; } if(sum>total)printf("NO\n"); else { if(k!=y)printf("YES\n"); else { if(total-sum==1)printf("NO\n"); else printf("YES\n"); } } } } }