此题不提供链接

题目描述



题解

首先看这个 f(i)f(i)f(i),其实就是个卡特兰数:f(i)=(2ii)i+1f(i)=\frac{{2i\choose i}}{i+1}f(i)=i+1(i2i​)​,这是很经典的结论了。你也可以从DP入手推一下,因为最优方案必定是选 nnn 个矩形,把DP式子列出来就知道了。

然后由于答案是 max⁡i=lrv7[(i+1)f(i)]\max_{i=l}^rv_7[(i+1)f(i)]maxi=lr​v7​[(i+1)f(i)],发现 (i+1)(i+1)(i+1) 被消掉了,最后只剩下 max⁡i=lrv7[(2ii)]=max⁡i=lrv7[(2i)!(i!)2]\max_{i=l}^rv_7[{2i\choose i}]=\max_{i=l}^rv_7[\frac{(2i)!}{(i!)^2}]maxi=lr​v7​[(i2i​)]=maxi=lr​v7​[(i!)2(2i)!​]。

由于答案只求7的次数,并且是阶乘,所以我们可以用另一个经典的基于递归枚举的计算方法算次数:
v7[(2n)!(n!)2]=∑i=0+∞(⌊2n7i⌋−2⌊n7i⌋)v_7[\frac{(2n)!}{(n!)^2}]=\sum_{i=0}^{+\infty}(\lfloor\frac{2n}{7^i}\rfloor-2\lfloor\frac{n}{7^i}\rfloor) v7​[(n!)2(2n)!​]=i=0∑+∞​(⌊7i2n​⌋−2⌊7in​⌋)
这个式子告诉我们,考虑7进制下的 nnn 的每个后缀,若×2过后会进位则有1的贡献,答案是所有后缀的贡献和。

这显然是可以数位DP的,只需要把 lll 和 rrr 都转成7进制数,然后讨论是否抵上界、是否抵下界、当前位是否进位进行转移即可。

代码

暴力压位高精进制转换

#include<bits/stdc++.h>//JZM yyds!!
#define ll long long
#define uns unsigned
#define IF (it->first)
#define IS (it->second)
#define END putchar('\n')
using namespace std;
const int MAXN=100005;
const ll INF=1e18;
inline ll read(){ll x=0;bool f=1;char s=getchar();while((s<'0'||s>'9')&&s>0){if(s=='-')f^=1;s=getchar();}while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar();return f?x:-x;
}
int ptf[50],lpt;
inline void print(ll x,char c='\n'){if(x<0)putchar('-'),x=-x;ptf[lpt=1]=x%10;while(x>9)x/=10,ptf[++lpt]=x%10;while(lpt)putchar(ptf[lpt--]^48);if(c>0)putchar(c);
}
inline ll lowbit(ll x){return x&-x;}ll mi[10]={1,7,49,343,2401,16807,117649,823543,5764801,40353607};
const ll w=40353607;
struct bigint{vector<ll>a;bigint(){}bigint(ll x){a.push_back(x);while(a.back()>=w)a.push_back(a.back()/w),a[a.size()-2]%=w;}inline int AT(int x){if(x/9>=(int)a.size())return 0;return a[x/9]/mi[x%9]%7;}inline bigint operator+(const bigint&b)const{bigint res=*this;res.a.resize(max(a.size(),b.a.size()));for(int i=0,lim=b.a.size();i<lim;i++)res.a[i]+=b.a[i];for(int i=0,lim=res.a.size();i<lim-1;i++)res.a[i+1]+=res.a[i]/w,res.a[i]%=w;while(res.a.back()>=w)res.a.push_back(res.a.back()/w),res.a[res.a.size()-2]%=w;while(res.a.size()>1&&!res.a.back())res.a.pop_back();return res;}inline bigint operator-(const bigint&b)const{bigint res=*this;for(int i=0,lim=b.a.size();i<lim;i++){res.a[i]-=b.a[i];if(res.a[i]<0)res.a[i]+=w,res.a[i+1]--;}for(int i=b.a.size(),lim=res.a.size();i<lim;i++)if(res.a[i]<0)res.a[i]+=w,res.a[i+1]--;while(res.a.size()>1&&!res.a.back())res.a.pop_back();return res;}inline bigint operator*(const bigint&b)const{bigint res;int la=a.size(),lb=b.a.size();res.a.resize(la+lb);for(int i=0;i<la;i++)for(int j=0;j<lb;j++)res.a[i+j]+=a[i]*b.a[j];for(int i=0,lim=res.a.size();i<lim-1;i++)res.a[i+1]+=res.a[i]/w,res.a[i]%=w;while(res.a.back()>=w)res.a.push_back(res.a.back()/w),res.a[res.a.size()-2]%=w;while(res.a.size()>1&&!res.a.back())res.a.pop_back();return res;}inline bigint operator/(const ll&d)const{bigint res=*this;for(int i=a.size()-1;i>=0;i--){if(i>0)res.a[i-1]+=res.a[i]%d*w;res.a[i]/=d;}while(res.a.size()>1&&!res.a.back())res.a.pop_back();return res;}
}l=bigint(0),r=bigint(0);
int n,a[MAXN],b[MAXN],dp[MAXN][2];
inline ll HS(int x,bool up,bool dm,bool e){return x<<3|(up<<2)|(dm<<1)|e;}
unordered_map<ll,int>F;
inline int dfs(int x,bool up,bool dm,bool e){if(x<0)return e?-1e8:0;if(!up&&!dm)return dp[x+1][e];if(F.find(HS(x,up,dm,e))!=F.end())return F[HS(x,up,dm,e)];int l=dm?a[x]:0,r=up?b[x]:6,res=-1e8;for(int i=l;i<=r;i++)for(int t=0;t<2;t++){if(e&&i>3-t)res=max(res,dfs(x-1,up&&i==r,dm&&i==l,t)+1);if(!e&&i<4-t)res=max(res,dfs(x-1,up&&i==r,dm&&i==l,t));}return F[HS(x,up,dm,e)]=res;
}
signed main()
{freopen("dingdingcar.in","r",stdin);freopen("dingdingcar.out","w",stdout);char s=getchar();while(s<'0'||s>'9')s=getchar();while(s>='0'&&s<='9')l=l*10+bigint(s^48),s=getchar();while(s<'0'||s>'9')s=getchar();while(s>='0'&&s<='9')r=r*10+bigint(s^48),s=getchar();n=max(l.a.size()*9,r.a.size()*9);for(int i=0;i<n;i++)a[i]=l.AT(i),b[i]=r.AT(i);dp[0][0]=0,dp[0][1]=-1e8;for(int i=1;i<=n;i++){//其实这个预处理的DP完全没必要dp[i][0]=dp[i][1]=-1e8;for(int j=0;j<7;j++){if(j<4)dp[i][0]=max(dp[i][0],dp[i-1][0]);if(j<3)dp[i][0]=max(dp[i][0],dp[i-1][1]);if(j>3)dp[i][1]=max(dp[i][1],dp[i-1][0]+1);if(j>2)dp[i][1]=max(dp[i][1],dp[i-1][1]+1);}}print(max(dfs(n,1,1,0),dfs(n,1,1,1)));return 0;
}

【2022省选模拟】叮叮车——卡特兰数、数位DP相关推荐

  1. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

  2. 1587 例题3 [SCOI2009] Windy 数(Bzoj1026 LOJ LUOGU2657 提高+/省选-) 需考虑前导0的数位DP

    总目录 在线测评地址(ybt) 在线测评地址(LOJ) 在线测评地址(LUOGU) 需考虑前导0的数位DP 以下内容,可以结合后续的AC代码进行阅读. dp[pos][pre]代表的是什么意思? po ...

  3. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  4. 【bzoj1026】[SCOI2009]windy数 数位dp

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...

  5. BZOJ1026 [SCOI2009]windy数 数位dp

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...

  6. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...

  7. BZOJ1026: [SCOI2009]windy数(数位dp)

    题意 题目链接 Sol 很zz的数位dp $f[i][j]$表示第$i$位,前一位是$j$的方案数 转移的时候枚举一下是否相同即可 注意当lim达到上界的时候是不能记忆化的! /**/ #includ ...

  8. 题解 BZOJ1026 luogu P2657 [SCOI2009]windy数 数位DP

    BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...

  9. AcWing1083. Windy数(数位DP)题解

    题目传送门 题目描述 Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数. Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共 ...

最新文章

  1. C++ 笔记(20)— 异常处理(抛出异常、捕获异常)
  2. Python 之 Numpy (六)分割
  3. android jni研究
  4. Linux中SysRq的使用[zt]
  5. 搜索引擎技术——全文检索基础原理
  6. 暴富、投机,金钱、欲望、人性,一个叫 Fomo3D的游戏正在刷新你的世界观
  7. 晓曼机器人能恢复出厂设置吗_手机出毛病了就恢复出厂设置,会损伤手机吗?影响有多大呢...
  8. 《TensorFlow:实战Google深度学习框架》——5.3 TensorFlow中的变量初始化函数
  9. C# 很基础的那些东西
  10. 如何提高NLP模型鲁棒性和泛化能力?对抗训练论文串讲
  11. 【Windows远程连接】登录显示密码过期
  12. 模拟与仿真两个词的区别
  13. 三峡学院计算机调剂,2018年重庆三峡学院考研预调剂信息公布
  14. 如何在Kubernetes中部署nginx
  15. 微信公众号 Markdown 排版工具
  16. td自动换行时不切断英文单词
  17. 计算机修改人类记忆曲线,Memory Helper - 艾宾浩斯遗忘曲线记忆助手
  18. 达人评测 麒麟9000、麒麟990e和苹果a15 哪个好
  19. android闪光灯
  20. “Error 403--Forbidden”错误

热门文章

  1. 一加5t ,安卓p系统卡在更新页面,安卓p降级教程(一加5t测试通过)
  2. windows10下用PowerShell命令(Get-FileHash)校验文件的Hash值(MD5、SHA1、SHA256等)
  3. 文件压缩算法详细分析(ZIP)及解压实例解释
  4. EOF和feof()区别
  5. P1164 小A点菜(DP动态规划,洛谷,java)
  6. 我慌了!我妈从床底掏出了我珍藏多年的小本本-----JAVA_Lambda表达式(笔记)
  7. 蓝牙(BLE)自动配对
  8. 实习日记——Day24
  9. 12306车站信息爬取(4)——添加车票的票价信息
  10. 经济学硕士读计算机博士,去美国那些大学攻读经济学博士比较好?看完你就清楚了...