题解 P2431 【正妹吃月饼】

· · 题解

与原题题解相对地,我们考虑倒序

用一个k位全为1的整数val表示初始的月饼集合,根据进制知识易知,这个整数的值就是这些月饼的重量和。

这个整数应当是第一个恰好不小于B的二进制全1数字

此后,我们从这个数的最高位(恰好是2^(k-1))开始向低位考虑,算法流程如下:

下面说明算法的正确性:

对于初始的月饼集合取值来说:

综上,我们通过全1二进制数作初始值的 正确性、决策(答案)包容性、不冗余性说明了恰好不小于B的全1二进制数作初始值的正确性。

对于算法流程本身来说

论毕

代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
ULL A,B;
int main(){
    cin>>A>>B;
    ULL val=1;
    while(val<B) val=(val<<1)+1;
    ULL Bit=(val+1)>>1;
    for(;val>B;Bit>>=1){
        val=val-Bit<A?val:val-Bit;
    }
    int cnt=0;
    for(;val;val>>=1) if(val&1) ++cnt;
    cout<<cnt;
    return 0;
}