洛谷$P$2235 $Kathy$函数 $[HNOI2002]$ 数位$dp$
正解:数位$dp$
解题报告:
$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$的更多相关文章
- 3150luogu洛谷
若说代码 那真的是很水 但是 思想却有点意思 这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢. 这道题的做法就是: 如果m为偶数, 那么先手赢( ...
- P1219 八皇后 洛谷
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷 P3742 umi的函数
传送门 思路 \(loceaner\)已经蔡虚鲲到连红题都不会做了 因为有\(special\ judge\)所以我们就可以瞎搞了! 由题目可知,只要有一个\(y[i] > x[i]\)则一定没 ...
- P1075,P1138(洛谷)
今天难得做了做洛谷的题,而且还是两个! P1075:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数.输入格式:一个正整数n.输出格式:一个正整数p,即较大的那个质数. 第一版代码: # ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- Cube Stacking 来源:洛谷
题目 题目oj(洛谷) Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...
- P1137 旅行计划-----洛谷
用了STL,其他的没什么,赤裸裸的拓扑排序 下面给出代码 #include<cstdio> #include<iostream> #include<vector> ...
- 单词接龙dfs洛谷
题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...
- 冰精冻西瓜[P3787洛谷]
题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...
- (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
题意翻译 题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了 ...
随机推荐
- 2018-2-13-WPF-获得触笔悬停元素上
title author date CreateTime categories WPF 获得触笔悬停元素上 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...
- 学习meta标签http-equiv属性
meta标签http-equiv属性的使用:meta标签http-equiv属性的使用
- protobuf_1
我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...
- 15个非常重要的Apache开源项目汇总
15个非常重要的Apache开源项目汇总 自1999年创立以来,Apache软件基金会如今已成了众多重要的开源软件项目之家.本文列举了15个多年来非常重要的Apache项目,这些项目不仅对开源运动来说 ...
- LRJ-Example-06-16-Uva10129
#include <cstdio> #include <cstring> #include <vector> using namespace std; + ; // ...
- LRJ-Example-06-13-Uva1103
pic[][]数组存储每个点的值,0或1,输入时在原图的周围加了一圈0. color[][]数组存储每个点的color值,从1开始,dfs(row, col, c) 负责对每个点着色,连通在一起的连通 ...
- pytorch lstm crf 代码理解 重点
好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...
- 在vuex的mutations中使用vue的小技巧
问题: 在vuex组件中的mutations属性中的定义的函数,有时会要用到vue这个对象.正常在其他的地方使用是通过this这个变量来获取,但是在mutations定义的函数中this指定的是Vue ...
- Javassist指引(一)
目录 原文链接 1. 读写字节码 1.1概述 Javassist是一个Java字节码类库.Java的字节码是包含Java类与接口,并按照一定的顺序存在class文件中. Javassist.CtCla ...
- P1105 数列
题目描述 给定一个正整数 \(k(2 \le k \le 15)\) ,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 \(k = 3\) 时,这个序列是: 1,3,4, ...