数据:
Input
The first line of the input contains one integer t (1≤t≤105) — the number of test cases.
The next tt lines describe test cases. The only line of the test case contains two integers n and k (1≤n,k≤107).
Output
For each test case, print the answer — "YES" (without quotes) if nn can be represented as a sum of k distinct positive odd (not divisible by 2) integers and "NO" otherwise.
Example
Input
6 3 1 4 2 10 3 10 2 16 4 16 5Output
YES YES NO YES YES NO
题意:6组数据,n和k 若k个不同的奇数求和等于n,即输出yes
思路:这里分享两种代码,首先分析清楚题意,是k个不同的奇数之和,先求出k个不同奇数之和的最小值,n至少大于等于这个最小值,才有可能yes(在某个奇数上一直+2...总会等于n的),其次n和k一定奇偶性相同(第二种代码表示的很简洁)...
code:注意的是,要开成long long型,两个数相乘可能超过int....
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
#define mem(a,b) memset(a,b,sizeof(a))
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,k;///!!
scanf("%lld %lld",&n,&k);
ll minn=(1+2*k-1)*k/2;///k个数所能组成的最小数值
if(k%2==0)///k为偶数 k个奇数之和比为偶数
{
if(n>=minn&&n%2==0)///n也为偶数
///通过最小值中的任意一个奇数一直+2...一定能取到之和等于n
printf("YES\n");
else printf("NO\n");
}
else ///k为奇数 k个之和比为奇数
{
if(n>=minn&&n%2!=0)///同理
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
///给定n,k 若k个不同的奇数相加得到n 则输出YES,反之no
the secondary:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
#define mem(a,b) memset(a,b,sizeof(a))
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,k;
scanf("%lld %lld",&n,&k);
if(n>=k*k&&(n-k)%2==0)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
///给定n,k 若k个不同的奇数相加得到n 则输出YES,反之no
很喜欢做cf上的题,大多数都偏向于开拓思维的题,单指前面的题,哈哈哈,后面的题是既要思维,又要算法知识....还是太菜了,继续努力!坚持不放弃