洛谷$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号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了 ...
随机推荐
- js+canvas黑白棋
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Jmeter正则表达式提取多个值示例
首先了解一下常用正则表达式的语法 \d 数字 \w 数字或者字母 . 可以匹配任意字符 星号* 表示任意个字符 + ...
- Bootstrap之Form表单验证神器: BootstrapValidator(转)
前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- CSS画矩形、圆、半圆、弧形、半圆、小三角、疑问框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- centos7搭建集群必知:centos7已经无iptables,只有firewall
1.防火墙概述 centos7搭建集群,发现没有iptables,需要安装.防火墙为firewalle CentOS7默认的防火墙不是iptables,而是firewalle. CentOS 7.0默 ...
- centOS 重启 php-fpm
ps axo pid,%cpu,%mem,comm |grep php-fpm ps aux | grep php-fpm pkill -9 php-fpm /etc/init.d/php-fpm ...
- 用adblock过滤页面上固定位置的悬浮窗
现在各种网站都喜欢加入position:fixed的悬浮窗,这些悬浮窗可以是分享按钮,可以是二维码,可以是各种烦人的按钮. 因为这些悬浮窗未必是广告,所以adblock很少自动屏蔽它们. 可这些悬浮窗 ...
- 【js】react-native Could not find iPhone 6 simulator 和 Entry, ":CFBundleIdentifier", Does Not Exist 两种报错解决办法
一.在运行rn app应用时,react-native run:ios 报错出现 Could not find iPhone 6 simulator 解决办法: 1.react-native r ...
- 【t081】序列长度
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个整数序列,我们不知道她的长度是多少(即序列中整数的个数),但我们知道在某些区间中至少有多少个整数 ...