返回顶部

C. Jellyfish and Green Apple

C. Jellyfish and Green Apple

题目大意:

n苹果,m个人,将苹果平分给每个人,每块苹果可以二分,问最少的分割次数

思路:

首先,当n%m==0时,说明,苹果可以等分直接输出0

其次当n>m时,n%=m,

最终的苹果块数x肯定是lcd(n,m),由lcd(n,m)gcd(n,m)=nm

因为苹果只能二分所以,每个苹果被分成的个数必须是2的幂级数,每个人拿到的苹果块数应该逢二进一(因为满二说明这刀可以不切),即x/m中二进制1的个数

code:

int n, m;
void solved()
{
    cin >> n >> m;
    if (n % m == 0)
    {
        cout << 0 << endl;
        return;
    }
    else
    {
        n %= m;
        int x = m * n / gcd(m, n);
        int x1 = x / n;
        if (x1 & (x1 - 1))
        {
            cout << -1 << endl;
            return;
        }
        int y = x / m;
        int res = 0;
        // while (y)
        // {
        //     if (y & 1)
        //         res++;
        //     y >>= 1;
        //     //  Brian Kernighan 的位计数算法
        //     // ++res;
        //     // y = (y & (y - 1));
        // }
        res = __builtin_popcount(y);
        cout << res * m - n << endl;
    }
}


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   bhxyry  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示