其他分享
首页 > 其他分享> > CF1661B Getting Zero-暴力枚举-有时候并不需要搜索

CF1661B Getting Zero-暴力枚举-有时候并不需要搜索

作者:互联网

题意:

有两种操作:

v=(v+1)mod 32768

v=2*v mod 32768

给定x,求x变为0的最小操作数

解:

什么时候x为0呢,x是32768的倍数的时候,可以发现x为答案的时候只能是32768本身(不能超过2*32768)

也就是x变为32768的最小操作数

这道题需要仔细发现的隐含条件是32768这个终态,实际上:32768=2^15=1<<15

故两种操作是v+i(加几次),v<<j(乘几次2转换为左移几次)

那么得到的数是:(v+i)<<j

要使其符合条件:((v+i)<<j mod (1<<15) ==0

操作数是什么呢?就是i+j

可以发现能加,乘几次呢?0-15

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int m=1<<15;
int main()
{
    int n;cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    for(const auto&v:a)
    {
        int ans=20;
        for(int add=0;add<16;add++)
        {
            for(int mul=0;mul<16;mul++)
            {
                if(((v+add)<<mul)%m==0){ans=min(ans,add+mul);}
            }
        }
        cout<<ans<<" ";
    }
    return 0;
}

 

标签:32768,操作数,const,CF1661B,Getting,int,add,Zero,include
来源: https://www.cnblogs.com/FeiShi/p/16697489.html