每天一道 CodeForces 构造/思维题 难度1500 (day3)

简介: 每天一道 CodeForces 构造/思维题 难度1500 (day3)

1题目

题目链接 Factorials and Powers of Two

题目大意:

给你一个整数n(1<=n<=1e12),它可以由两种类型的数组成

  • 类型1:2的整数次幂
  • 类型2:k的阶乘

这个数可以由这两种类型任意多个组成,但是组成n的数字中不能由相同数字。

问最少由多少个这两种类型的数组成整数n

2思路

这是一个整数划分问题,但是这个整数特别大,所以不能用动态规划来求。

我们可以假设只有类型1组成整数n,那么只需要n的2进制有多少个1就是答案了。

但是我们现在是两种类型的结合

假设有k个数的阶乘和为sum之后,那么就剩下n-sum了,剩下全部由类型1组成。

所以 n = k + n-k ,cnt = k + get_bit_count(n-sum)

所以为了使cnt最小,我们只需要计算所有k的可能性即可,这里k最多有14,因为15!> 1e12 了。所以我们可以用位运算来枚举所有的集合,而且集合中每个数字都不一样,还有n-sum中的所有数也不会一样。

注意这里使没办法贪心的,没有规律可言,所以只能按照枚举所以的情况即可。

3代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, int> PII;
#define x first
#define y second
const int N = 2e4 + 10;
PII a[N];
ll f[20];
int get_bit(ll x)
{
    int ans = 0;
    for (int i = 0; i < 60; i++)
    {
        if (x >> i & 1)
            ans++;
    }
    return ans;
}
void init()
{
    f[0] = 1;
    for (int i = 1; i <= 14; i++)
        f[i] = f[i - 1] * i;
    for (int i = 0; i < 1 << 14; i++)
    {
        ll ans = 0;
        int cnt = 0;
        for (int j = 0; j < 14; j++)
        {
            if (i >> j & 1)
            {
                ans += f[j + 1];
                cnt++;
            }
        }
        a[i] = {ans, cnt};
    }
}
void solve()
{
    ll n;
    cin >> n;
    int ans = 1e9;
    for (int i = 0; i < 1 << 14; i++)
    {
        if (a[i].x <= n)
        {
            ans = min(ans, a[i].y + get_bit(n - a[i].x));
        }
    }
    cout << ans << endl;
    return;
}
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    init();
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
相关文章
|
easyexcel
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
|
前端开发 开发者 容器
|
安全 云计算
网站交互式公安备案详细流程
依据 《计算机信息网络国际联网安全保护管理办法》 相关规定,各网站在工信部备案成功后,需在网站开通之日起30日内登录全国公安机关互联网站安全管理服务平台提交公安联网备案申请
3934 0
网站交互式公安备案详细流程
|
缓存 监控 JavaScript
《Electron应用性能深耕:资源加载与内存治理的进阶路径》
本文围绕Electron桌面应用的性能优化展开,深入剖析了资源加载与内存治理的进阶路径。从底层机制出发,分析了Electron在主进程预加载、渲染进程解析、跨进程共享等环节的资源加载瓶颈,提出了包含动态加载、多级缓存、格式优化等在内的突破策略;针对内存占用问题,从渲染进程、主进程、GPU内存管理及垃圾回收机制等方面,构建了系统性优化方案。同时,结合实战案例探讨了优化中的辩证关系与跨平台适配经验,强调以数据驱动实现动态调节,为提升Electron应用性能提供了全面且深入的技术指引。
684 0
|
缓存 人工智能 算法
深度揭秘复杂异构硬件推理优化
本文介绍了大语言模型在部署推理层面的性能优化工作,涵盖高性能算子、量化压缩、高效运行时及分布式调度四个方面。面对参数和上下文规模增长带来的显存、缓存与计算开销挑战,文中详细探讨了如何通过优化算子性能、低精度量化压缩、异步运行时框架设计以及多层次分布式架构来提升大模型推理效率。此外,还展示了BladeLLM引擎框架的实际应用效果,证明了这些技术在高并发场景下的显著性能提升。
|
定位技术
云端服务器与实体服务器的差异是什么?香港CN2服务器的评价如何?
总的来说,云端服务器和实体服务器各有优势,选择哪种类型的服务器,主要取决于你的业务需求和预算。而香港CN2服务器则是一种高质量的网络服务选择,适合对网络质量有较高要求的用户。
360 33
|
运维 监控 安全
一文讲清质量管理5M1E分析法的底层逻辑
本文介绍了质量管理中的5M1E分析法,即从人、机、料、法、环、测六个方面系统分析质量波动原因,并提供具体管理方法与实操要点。通过整体联动与闭环管控,帮助企业实现质量管理的系统化与高效化,提升产品质量与稳定性。
|
存储 关系型数据库 数据库
Postgres数据库BRIN索引介绍
BRIN索引是PostgreSQL提供的一种高效、轻量级的索引类型,特别适用于大规模、顺序数据的范围查询。通过存储数据块的摘要信息,BRIN索引在降低存储和维护成本的同时,提供了良好的查询性能。然而,其适用场景有限,不适合随机数据分布或频繁更新的场景。在选择索引类型时,需根据数据特性和查询需求进行权衡。希望本文对你理解和使用PostgreSQL的BRIN索引有所帮助。
638 0
|
负载均衡 Java Nacos
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud 2020版起,Ribbon被弃用,转而使用Spring Cloud LoadBalancer。Ribbon支持轮询、随机、加权响应时间和重试等负载均衡策略;而Spring Cloud LoadBalancer则提供轮询、随机及Nacos负载均衡策略,基于Reactor实现,更高效灵活。
1096 0
|
Linux Windows
【Linux】grub命令行引导进入windows系统
【8月更文挑战第20天】在Linux中通过GRUB命令行引导Windows的方法包括:1) 进入GRUB命令行模式,启动时按`c`键;2) 使用`ls`查找含Windows引导文件的分区,如`bootmgr`或`ntldr`;3) 设置根设备`root=(hd0,msdos3)`与链加载器`chainloader +1`;4) 输入`boot`命令启动Windows。请注意实际步骤可能因系统配置而异。
3296 3

热门文章

最新文章