正解:数位$dp$

解题报告:

传送门$qwq$

$HNOI$的题从02年就这么神了嘛$QAQ$,,,

嗷对了这题如果看出了一个结论就是个数位$dp$板子,,,?但是结论很神我$jio$得挺难看出来的_(:з」∠)_

先港结论,,,,$f_{i}$等于$i$的二进制下翻转之后的值,即$f((\overline{a_{1}a_{2}a_{3}a_{4}a_{5}})_2)=(\overline{a_{5}a_{4}a_{3}a_{2}a_{1}})_2$,,,这谁想得到啊$TT$

下试证$QwQ$

考虑数学归纳法,不难发现当$i=1,2,3$时都成立

然后对于$n=2\cdot k$,显然有$f_{n}=1$,显然依然成立

对于$n=4\cdot k+1$,设$k=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}})_2$,则$2\cdot k+1=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}1})_2,4\cdot k+1=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}01})_2$,所以有$f(n)=2\cdot (\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_2-(\overline{a_{5}a_{4}a_{3}a_{2}a_{1}})_2=(\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_{2}+((\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_{2}-(\overline{a_{5}a_{4}a_{3}a_{2}a_{1}})_2)=(\overline{10a_{5}a_{4}a_{3}a_{2}a_{1}})_{2}$,成立

对于$n=4\cdot k+3$,同理地设$k=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}})_2$,则$2\cdot k+1=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}1})_2,4\cdot k+3=(\overline{a_{1}a_{2}a_{3}a_{4}a_{5}11})_2$,所以有$f(n)=3\cdot (\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_2-2\cdot (\overline{a_{5}a_{4}a_{3}a_{2}a_{1}})_2=(\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_2+2\cdot ((\overline{1a_{5}a_{4}a_{3}a_{2}a_{1}})_2-(\overline{a_{5}a_{4}a_{3}a_{2}a_{1}})_2)=(\overline{11a_{5}a_{4}a_{3}a_{2}a_{1}})_{2}$,依然成立

综上,证毕

欧克现在证完了就继续思考这题怎么做趴$QwQ$

首先显然把$m$转换成二进制${m}'$,然后现在就变成了,询问在${m}'$以内的所有二进制数有多少个是回文数

$umm$其实感觉到这儿了乱搞应该也能做出来辣,,,?但我还是大概港下数位$dp$做法趴$kk$

$umm$其实就差不多的套路,,,?因为我数位$dp$比较喜欢用$dfs$那种的就只港下$dfs$版怎么做鸭$QwQ$

首先显然考虑记录一个$pos$,一个$lim$,然后因为这题是要判断回文,所以显然要有个$bool$变量记录是否是回文,然后还有一个点就是,比如有这种情况:$00011$,如果直接判断就不是个回文数了,所以要考虑再记录一个实际位数,瞎判下就好

所以总共就记录四个变量,然后套路地做下就好

嗷还有一个,这题真的$real$奇葩,,,还强行加了个高精,,,读入还要强行高精转进制,,,神烦,,,我要死了$TT$

所以并不推荐用这题练习数位$dp$($bushi$

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define il inline
#define lf double
#define fi first
#define sc second
#define gc getchar()
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,M=+;
int a[N],cnt,tmp[N],vis[N][N][],lst=,qaq;
struct big_int
{
int num,a[M];
il void reve(ri l,ri r){while(l<r){swap(a[l],a[r]);++l;--r;}}
il void read(){char str=gc;while(str>'' || str<'')str=gc;while(str>='' && str<='')a[++num]=str^'',str=gc;reve(,num);}
big_int(){num=;memset(a,,sizeof(a));}
void operator = (int x){while(x)a[++num]=x%,x/=;}
il void print(){if(!num)return void(printf("0\n"));my(i,num,)printf("%d",a[i]);printf("\n");}
}as,f[N][N][],tmpp; il big_int operator + (big_int gd,big_int gs)
{gd.num=max(gd.num,gs.num);rp(i,,gd.num){gd.a[i]=gd.a[i]+gs.a[i]+gd.a[i-]/;gd.a[i-]%=;if(i==gd.num && gd.a[i]>)++gd.num;}return gd;}
il big_int operator / (big_int gd,int gs)
{
big_int ret;ri x=;
my(i,gd.num,){ret.a[i]=(gd.a[i]+x*)/gs;x=(x*+gd.a[i])%gs;}
ret.num=gd.num;while(ret.num && !ret.a[ret.num])--ret.num;return ret;
}
il int operator % (big_int gd,int gs){ri x=;my(i,gd.num,)x=(x*+gd.a[i])%gs;return x;}
il big_int solve(ri num,ri pos,rb jud,rb lim)
{
big_int ret;ret=;if(pos<){if(jud && num)ret=;return ret;}if(!lim && vis[pos][num][jud])return f[pos][num][jud];if(!jud)return ret;
ri mx=lim?a[pos]:;
rp(i,,mx)
{
tmp[pos]=i;
if(pos==num && !i)ret=ret+solve(num-,pos-,jud,lim && i==mx);
else ret=ret+solve(num,pos-,(jud && pos<=num/)?tmp[num-pos+]==i:jud,lim && i==mx);
}
if(!lim)vis[pos][num][jud]=,f[pos][num][jud]=ret;
return ret;
} int main()
{
freopen("2235.in","r",stdin);freopen("2235.out","w",stdout);
tmpp.read();while(tmpp.num){a[++cnt]=tmpp%;tmpp=tmpp/;}
as=solve(cnt,cnt,,);as.print();
return ;
}

洛谷$P$2235 $Kathy$函数 $[HNOI2002]$ 数位$dp$的更多相关文章

  1. 3150luogu洛谷

    若说代码 那真的是很水 但是 思想却有点意思 这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢. 这道题的做法就是: 如果m为偶数, 那么先手赢( ...

  2. P1219 八皇后 洛谷

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  3. 洛谷 P3742 umi的函数

    传送门 思路 \(loceaner\)已经蔡虚鲲到连红题都不会做了 因为有\(special\ judge\)所以我们就可以瞎搞了! 由题目可知,只要有一个\(y[i] > x[i]\)则一定没 ...

  4. P1075,P1138(洛谷)

    今天难得做了做洛谷的题,而且还是两个! P1075:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数.输入格式:一个正整数n.输出格式:一个正整数p,即较大的那个质数. 第一版代码: # ...

  5. [NOIP2013 提高组] 华容道 P1979 洛谷

    [NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...

  6. Cube Stacking 来源:洛谷

    题目 题目oj(洛谷) Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...

  7. P1137 旅行计划-----洛谷

    用了STL,其他的没什么,赤裸裸的拓扑排序 下面给出代码 #include<cstdio> #include<iostream> #include<vector> ...

  8. 单词接龙dfs洛谷

    题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...

  9. 冰精冻西瓜[P3787洛谷]

    题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...

  10. (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷

    题意翻译 题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了 ...

随机推荐

  1. Vue.js 第2章 钩子函数&自定义指令&过滤器&计算属性&侦听器

    目标 钩子函数 自定义指令 自定义过滤器 计算属性 监听属性 局部自定义指令 为什么需要自定义指令 为了复用,为了代码的灵活 指令的分类:全局指令,局部指令 在vm外面创建的指令 通过Vue.dire ...

  2. jQuery 无刷新评论

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 自定义View系列教程06--详解View的Touch事件处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  4. golang gin框架 使用swagger生成api文档

    github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag ...

  5. epoll简介(一)

    一:概述   1:简介 EPOLL类似于POLL,是Linux特有的一种IO多路复用的机制.它在2.5.44内核中引入. 对于大量的描述符处理,EPOLL更有优势,它提供了三个系统调用来创建管理epo ...

  6. @bzoj - 3749@ [POI2015] Łasuchy

    目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...

  7. 使用Laravel的队列实现系统通知、

    使用Laravel的队列实现系统通知. 第一步:创建 jobs表的migrate php artisan queue:table 第二步:创建jobs 表 php artisan migrate 第三 ...

  8. vue+vant 购物车的全选和反选

    https://blog.csdn.net/wjswangjinsheng/article/details/91392694

  9. Python--day23--组合

  10. 51nod1327 棋盘游戏

    远古大坑 神仙DP状态设计题 https://blog.csdn.net/white_elephant/article/details/83592103 从行的角度入手,无论如何都要状压 每列最多放一 ...