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;
}
复制代码

 

posted @   惣聪术  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示