1 条题解

  • 0
    @ 2022-10-29 20:31:05

    不约分 res= n∗( n + 1 ) / 2

    考虑约分,对于n来说, 有 t = n / 2 个偶数,每次除2相当于把偶数再减少一半

    找规律,可知每次被约分掉的总和是等差数列求1到被约分掉的数字个数之和,也就是t(t+1)/2,所以每次res都减去t(t+1)/2,当!n或!k时停止

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main()
    {
        ll t, n, k, res;
        scanf("%lld", &t);
        while (t--)
        {
            scanf("%lld%lld", &n, &k);
            res = n * (n + 1) / 2; //先用等差数列求和公式求出总和
            while (n && k)
            {
                n /= 2;                   //会被约分的数字个数每次都是总长的一半
                --k;                      //每次被约分,2的次数减一
                res -= (n * (n + 1) / 2); //找规律,可知每次被约分掉的总和是 等差数列求1到被约分掉的数字个数之和
            }
            printf("%lld\n", res);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    806
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    263
    已通过
    36
    上传者