赶脚我的思维已经到了极限了,好难懂
/* * this code is made by LinMeiChen * Problem: * Type of Problem: * Thinking: * Feeling: */ #include<algorithm> #include<iostream> #include<string.h> #include<stdio.h> #include<math.h> #include<stdlib.h> using namespace std; #define maxn 210000 int Hash[maxn] = { 0 }; void Hash_Map() { int temp = sqrt((double)maxn); temp++; Hash[0] = 1; for (int i = 1; i <= temp; i++) Hash[i*i] = 1; } bool Judge(int x, int n, int k) { int not = n - x; int sum = 0, a = 0; for (int i = 1; i <= k - 2; i++) { a++; if (a == not) a++; sum += a; }// printf("%d %d\n", sum, x); if (sum + not >= n) return false; int left = x - sum; if (left <= a) return false; a++; if (a == not || a + 1 == not) { if (left == not) return false; } return true; } int main() { Hash_Map(); int n, k, m; while (scanf("%d%d", &n, &k) != EOF) { bool find = false; for (int i = n - 1; i >= 1; i--) if (Hash[i]) if (Judge(i, n, k)) { find = true; break; } if (find) printf("YES\n"); else printf("NO\n"); } return 0; } /* 2 2 4 2 22 4 5 2 6 2 11 4 25 7 */ /* 没过数据:22 6 输出: NO */