HDU 4982/BC 6B Goffi and Squary Partition

20 篇文章 0 订阅

题面大意 给定n,k问是否有k个不同正整数 和为n 且其中k-1个数 是某个数的平方数

设 k-1个数等于 i²,每次从大到小枚举i,看是否存在合法的,由于k个数 必须不同,所以 出来k-1个数 剩下一个数 z=n-i²。当z>k时 k-1个数从1 到k-1 排列,只要比i²小,比i²小的部分  可以从大到小 不断加一的方式 来完美的 凑出所以比 k(k-1)/2大的所有数。但当z=k时,k-1个数从1 到k-1 排列,由于不能和已经确定的z值冲突,无法形成 比k(k-1)/2正好大一的数 ,特判下即可。z<k时,把z混到k中即可。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include<stack>
#include<bitset>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;
#define bug puts("bugbugubgbugbug");
int go(int n,int m,int z)
{
    if(z<=0)return 0;
    if(z>m)
    {
        m--;
        if(m*(m+1)/2<=n-z)
            return 1;
        return 0;
    }
    else
    {
        if(z==m)
        {
            if(m*(m+1)/2==n-1)
                return 0;
        }
        if(m*(m+1)/2<=n)
            return 1;
        return 0;
    }
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int flag=0;
        int z=sqrt(n);
        while((z+1)*(z+1)<=n)z++;
        for(int i=z;i>=1;i--)
        if(go(n,m,n-i*i))
        {
            flag=1;
            break;
        }
        if(flag)puts("YES");
        else puts("NO");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值