洛谷$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号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了 ...
随机推荐
- LeetCode54 Spiral Matrix
题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...
- 07Redis入门指南笔记(主从复制、哨兵)
现实项目中通常需要若干台Redis服务器的支持: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载.这就需要为数据生成多个副本并分配在不同的服务器上: 容量上,单个 ...
- 威胁快报|挖矿团伙8220进化,rootkit挖矿趋势兴起
近日,阿里云安全团队发现8220挖矿团伙为了更持久的驻留主机以获得最大收益,开始使用rootkit技术来进行自我隐藏.这类隐藏技术的使用在watchdogs等挖矿蠕虫使用后开始出现逐渐扩散和进化的趋势 ...
- kubernetes API 访问控制在阿里云容器服务(ACK)上的实践
提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供 ...
- uva 11375 Matches (递推)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Sublime插件:增强篇
Sublime Text 如何安装插件详见:https://packagecontrol.io/installation WordCount:可以实时显示当前文件的字数. 安装后,后下角多出字数 En ...
- POJ2976 题解 0/1分数规划入门题 二分
题目链接:http://poj.org/problem?id=2976 关于 0/1分数规划 参见 这篇博客 实现代码如下: #include <cstdio> #include < ...
- Python--day72--json内容回顾
前后端分离,Json格式字符串:序列化和反序列化 """ 复习python中的json模块 """ import json s = '{&q ...
- POJ 2752 Seek the Name, Seek the Fame next数组理解加深
题意:给你一个字符串,寻找前缀和后缀相同的子串(包括原串). 从小到大排列输出其子串的长度 思路:KMP next 数组应用. 其实就是一个数学推导过程. 首先由next数组 可知s(ab) = s ...
- 2001年NOIP普及组复赛题解
题目涉及算法: 数的计算:动态规划: 最大公约数和最小公倍数问题:质因数分解: 求先序排列:递归: 装箱问题:动态规划(纯0-1背包问题) 数的计算 题目链接:https://www.luogu.or ...