当前位置: 首页 > news >正文

【Luogu】P4317 花神的数论题 (数位DP)

P4317 花神的数论题 - 洛谷

题目:

思路:

数位DP

本题让我们求 sum(i) 的乘积,其中 i 属于 1 ~ N,sum(i) 代表二进制中 i 的 1 的个数

那么转化题意,我们数位DP是计算符合某些特征的数字的个数,那么本题中我们也是将答案拆分一个一个求

具体的,我们这里的特征可以定义为在二进制下含有 k 个 1 的数的个数,那么我们只需要求出所有可能 k 的个数即可,然后用个快速幂乘起来就是答案,为什么呢?因为 sum(i) 其实算的就是 1 的数量,多个同样的 sum 不就刚好符合快速幂吗,而这里我们就是枚举 sum(i) 来快速得到答案

所以考虑记忆化搜索,我们定义 dp[i][k][j] 为 处理了 i 位,且当前枚举的 sum(i) 为 k,之前已经有过 j 个 1 的结果

那么考虑 dfs 状态,我们既然要知道二进制下的 1 的数量,不妨考虑直接枚举二进制形式下的数,既能快速计算 1,也能枚举到所有情况

而对于参数部分我们只需要多一个 sum 用于储存之前有过多少个 1 即可,其余都是板子

具体实现看代码,难点在于想到直接枚举二进制,以及分解为求固定 sum(i)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define Sunny 0
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());const int MOD = 10000007;
int a[64], len = 0;
//i 位 1 数量为 j
int dp[64][64][64];
int nowchose;
int dfs(int now,int lim,int sum)
{if(!now) return sum==nowchose;if(!lim && dp[now][nowchose][sum] != -1) return dp[now][nowchose][sum];int mx = lim ? a[now] : 1;int res = 0;for(int i = 0;i <= mx;i++){res += dfs(now-1,lim && i == mx,sum + (i == 1));}if(!lim) dp[now][nowchose][sum] = res;return res;
}int qp(int a,int b)
{int res = 1;a %= MOD;while (b){if(b & 1) res = res * a % MOD;a = a*a % MOD;b >>= 1;}return res;
}void solve()
{int x;cin >> x;while (x)a[++len] = x & 1, x>>=1;memset(dp,-1,sizeof dp);int ans = 1;//枚举多少个 1for (int i = 1; i <= len; i++){nowchose = i;ans = ans * qp(i,dfs(len,1,0)) % MOD;}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;while (t--){solve();}return Sunny;
}

http://www.dtcms.com/a/349227.html

相关文章:

  • 深度学习周报(8.18~8.24)
  • ASCII码值,可打印的字符有
  • 文档目录索引
  • 详解无监督学习的核心原理
  • 基于实例教学的软件工程专业教学系统
  • Livedata:感知生命周期变化,如何更新数据?避免内存泄漏,黏性事件
  • TCP--执行Linux命令(虚拟xshell)
  • 苍穹外卖项目实战(日记十)-记录实战教程及问题的解决方法-(day3-2)新增菜品功能完整版
  • 不再让Windows更新!Edge游戏助手卸载及关闭自动更新
  • Leetcode 3661. Maximum Walls Destroyed by Robots
  • 阿里AI模型获FDA突破性医疗器械认定,AI医疗走向国际舞台,来近屿智能系统学习AIGC大模型技术
  • 芋道前端项目部署后刷新 404 的解决办法(Nginx 配置教程)
  • 计算机网络:聊天室(UDP)
  • 器件(十)——经典封装类型总结
  • JUC之ThreadLocal
  • MySQL的安装和卸载指南(入门到入土)
  • python写上位机并打包250824
  • 第04章 SPSS简介与数据库构建
  • 2025最新ncm转MP3,网易云ncm转mp3格式,ncm转mp3工具!
  • C6.1:发射极偏置放大器
  • 支持多种模型,无限AI生图工具来了
  • 智元精灵GO1 agibot数据转换Lerobot通用格式数据脚本
  • 3.2 半导体随机存取存储器 (答案见原书 P168)
  • 你在四阶段数据成熟度旅程中处于哪个阶段?
  • 高数 不定积分(4-3):分部积分法
  • APP逆向——某站device-id参数(2)
  • 56 C++ 现代C++编程艺术5-万能引用
  • Linux内核ELF文件签名验证机制的设计与实现(C/C++代码实现)
  • DeepSeek对采用nginx实现透传以解决OpenShift 4.x 私有数据中心和公有云混合部署一套集群的解答
  • 机床智能健康管理系统:工业母机数字化转型的核心引擎​