2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空)
2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空)
https://www.luogu.com.cn/problem/P2328
题意:
输出n位B进制的格雷码。
分析:
好吧,咱先写出来一部分格雷码试试。
当 \(n=2,B=2\) 时(这个表咱竖着看)
| 00 | 10 |
|---|---|
| 01 | 11 |
似乎没有什么规律,咱继续,当\(n=3,B=3\) 时(这个表咱竖着看)
| 000 | 122 | 200 |
|---|---|---|
| 001 | 121 | 201 |
| 002 | 120 | 202 |
| 012 | 110 | 212 |
| 011 | 111 | 211 |
| 010 | 112 | 210 |
| 020 | 102 | 220 |
| 021 | 101 | 221 |
| 022 | 100 | 222 |
似乎发现点规律:
1.去掉重复的数字,总是一个固定的数字循环在不断重复:
\]
2.从右往左数第 \(i\) 列数字在同一循环节里出现的次数为 \(B^{i-1}\) ;
3.这可以用除法以及取模哟~
咱继续实验,当 \(n=2,B=3\) 时:
| 00 | 01 | 02 | 12 | 11 | 10 | 20 | 21 | 22 |
|---|
这一行咱横着看,是不是依旧符合那个规律?
对于第 \(i\) 个出现的格雷码,对于它的第 \(j\) 位上数字编号(不是字母,咱多个函数转一下字符就行):
1.计算它是属于第几个出现的字符,这里咱先除去每个循环节重复的字符数,找到它是第几个不重复的字符
\]
2.计算它在每个循环节中的位置,每个循环节长度为 \(2*B\)
\]
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int n,B,num[100],len[100];
inline int ksm(int x,int y){
int fin=1;
while(y){
if(y&1)fin*=x;
x*=x;
y>>=1;
}
return fin;
}
inline char id(int x){
if(x>=0&&x<=9)return (char)(x+'0');
else return (char)(x-10+'A');
}
int main(){
IOS;
cin>>n>>B;
for(int i=0;i<B;i++)num[i+1]=num[2*B-i]=i;
//for(int i=1;i<=2*B;i++)cout<<num[i]<<" ";cout<<endl;
int m=ksm(B,n);
//for(int i=0;i<=35;i++)cout<<id(i)<<" ";cout<<endl;
for(int i=n-1;i>=0;i--)len[i+1]=ksm(B,i);
//for(int i=1;i<=n;i++)cout<<len[i]<<" ";cout<<endl;
for(int i=1;i<=m;i++){
for(int j=n;j>=1;j--){
int x=i%len[j]?i/len[j]+1:i/len[j];
x%=2*B;
cout<<id(num[x]);
}
cout<<endl;
}
return 0;
}
2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空)的更多相关文章
- P2328 [SCOI2005]超级格雷码
P2328 [SCOI2005]超级格雷码 暴力出奇迹喵! 这是一道模拟题 你会发现和 P5657 格雷码[民间数据]有异曲同工之妙,这道题直接按照上边链接题目的操作步骤 暴力模拟 就可以啊 我们观察 ...
- bzoj1081: [SCOI2005]超级格雷码(dfs)
1081: [SCOI2005]超级格雷码 题目:传送门 题解: 又是一道水题... 因为之前做过所以知道规律: 如n=2 B=3: 00 10 20 21 11 01 02 12 22 ...
- 1081: [SCOI2005]超级格雷码
1081: [SCOI2005]超级格雷码 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 301 Solved: 159[Submit][Statu ...
- 【BZOJ1081】[SCOI2005]超级格雷码(搜索)
[BZOJ1081][SCOI2005]超级格雷码(搜索) 题面 BZOJ 洛谷 题解 找个规律吧,自己随便手玩一下,就按照正常的顺序枚举一下,发现分奇偶位考虑正序还是逆序就好了. #include& ...
- BZOJ1081[SCOI2005]超级格雷码
Description 著名的格雷码是指2n个不同n位二进制数(即0~2n-1,不足n位在前补零)的一个排列,这个排列满足相邻的两个二进制数的n位数字中最多只有一个数字不同(例如003和001就有一个 ...
- [BZOJ 1081] [SCOI2005] 超级格雷码 【找规律】
题目链接:BZOJ - 1081 备注:此题BZOJ上貌似没有 spj ,要把一般顺序的每个格雷码倒着输出...比如 0102 输出为 2010 题目分析 就是按照 Gray 码的生成方法写前几个出来 ...
- [SCOI2005]超级格雷码
题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...
- [bzoj1081]超级格雷码
手动模拟一组样例,可以理解大致应该如何操作具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> ...
- 格雷码原理与Verilog实现
格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...
随机推荐
- sublime settings
{ "font_face": "Monaco", // 编辑器的字体 "font_size": 13, // 字号 "highli ...
- MVC 生成安全验证码(例:用于登陆验证)(转)
---------html <td>验证码:</td> <td> <img src="/Login/CheckCode?ID=1" id= ...
- R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操
今天要给大家分享的统计方法是马尔可夫多态模型,思路来源是下面这篇文章: Ward DD, Wallace LMK, Rockwood K Cumulative health deficits, APO ...
- [USACO08OPEN]牛的街区Cow Neighborhoods
题目描述: luogu 题解: 技巧题. 曼哈顿距离:$|x1-x2|+|y1-y2|$ 切比雪夫距离:$\max(|x1-x2|,|y1-y2|)$ 曼哈顿距离转切比雪夫距离:$(x,y)-> ...
- Mybatis配置错误:java.lang.ExceptionInInitializerError
情况一:配置文件,无法被导出或者生效 修改前: 修改后: 究其原因,这是由于Maven的约定大于配置,导致我们写的配置文件,无法被导出或者生效的问题,解决方案: 在pom.xml文件中配置导出非res ...
- gofs使用教程-基于golang的开源跨平台文件同步工具
概述 gofs是基于golang开发的一款开箱即用的跨平台文件同步工具,开源地址如下:https://github.com/no-src/gofs,欢迎点个Star或者提交Issue和PR,共同进步! ...
- 面试官:volatile关键字用过吧?说一下作用和实现吧
volatile 可见性的本质类似于CPU的缓存一致性问题,线程内部的副本类似于告诉缓存区 面试官:volatile关键字用过吧?说一下作用和实现吧 https://blog.csdn.net/ ...
- Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 ?
面试官:想了解对 ES 集群的运维能力. 解答: 1.关闭缓存 swap; 2.堆内存设置为:Min(节点内存/2, 32GB); 3.设置最大文件句柄数: 4.线程池+队列大小根据业务需要做调整: ...
- Homebrew 卸载后重新安装mysql
1.卸载https://blog.csdn.net/liuxw1/article/details/81434005 https://jingyan.baidu.com/article/5553fa82 ...
- 【STM32】MDK中寄存器地址名称映射分析
对于MCU,一切底层配置,最终都是在配置寄存器 51单片机访问地址 51单片机经常会引用一个reg51.h的头文件.下面看看它是怎么把名字和寄存器联系在一起的: 1 sfr p0=0x80; 2 p0 ...