Ryoku 与最初之人笔记
题目描述
求满足
思路点拨
这里提供一种数位dp的做法。
考虑
由于
我们考虑使用数位dp结局这个问题。我们定义
如果
-
。因为这一位可以填 ,所以对于数字 而言,这一数位 两数可以使用的组合为 。 则是代表如果填 ,可以消除二进制位的限制。 -
。为了保持超出二进制位,所以第 位 至少有一个填 ,组合可以有 。
如果没有满足
-
。不超出限制只可以填 。 -
。可以从 转移是因为可以让 在第 位至少填一个 可以使其超出限制,所以可以选择 ;为什么可以从 转移上面解释过了。
初始化,如果
如果
可能比较抽象,如果不理解可以自己手玩一下。时间复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=64,N=60,mod=1e9+7;
int n,dp[MAXN][2];
signed main(){
cin>>n;
if(n&1)
dp[0][0]=3;
else dp[0][0]=1,dp[0][1]=2;
for(int i=1;i<=N;i++){
if(n&(1ll<<i)){
dp[i][0]=(dp[i-1][0]*3+dp[i-1][1])%mod;
dp[i][1]=(dp[i-1][1]*2)%mod;
}
else{
dp[i][0]=dp[i-1][0];
dp[i][1]=(dp[i-1][0]*2+dp[i-1][1]*3)%mod;
}
}
cout<<(dp[N][0]-(n+1)%mod+mod)%mod;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现