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年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...
随机推荐
- 选择Key-Value Store
[IT168 专稿]在之前的文章中,给大家介绍了<Redis快速入门:Key-Value存储系统简介>,今天进一步给大家介绍为什么选择Key-Value Store.Key-Value S ...
- Flink不止于计算,存算一体才是未来
"伴随着实时化浪潮的发展和深化,Flink 已逐步演进为实时流处理的领军技术和事实标准.Flink 一方面持续优化其流计算核心能力,不断提高整个行业的流计算处理标准,另一方面沿着流批一体 ...
- 对象头源码讲解,原来,指向objectMonitor的指针在这里
markword 注释 该文件目录在: \openjdk-jdk8u\hotspot\src\share\vm\oops\markOop.hpp #ifndef SHARE_VM_OOPS_MARKO ...
- 面试问题之C++语言:C++中指针和引用的区别
转载于:https://blog.csdn.net/gcc2018/article/details/82285940 1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用 ...
- 模糊查询like语句该怎么写?
第1种:在Java代码中添加sql通配符. string wildcardname = "%smi%"; list<name> names = mapper.selec ...
- Kafka 都有哪些特点?
高吞吐量.低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作. ...
- 学习Nginx(三)
nginx的性能测试及常用优化手段 一.nginx的性能测试及对比 1.环境准备 [root@test8_hadoop_kaf ~]# yum install -y httpd-tools [ro ...
- 企业流程再造(BPR)--系统重构
企业流程再造(BPR) 企业流程:指生产或服务过程中一连串活动的工作流程 企业流程再造:对企业流程所进行的根本性的在思考和彻底的再设计,以使企业的速度,质量,服务和成本等关键业绩指标获得根本性的改善
- AGENS算法
3.2 层次方法 下图,上面是从左到右由5个簇逐渐合并成1个簇的过程,下面是从右到左由一个簇逐渐分裂成5个簇的过程 AGENS算法 最后面一句话是重点,假设有<A,B>,<C,D&g ...
- ESD@TVS选型
一.工作原理 ESD ESD静电保护元件,又称静电抑制二极管.ESD是多个TVS晶粒或二极管采用不同的布局做成具有特定功能的多路或单路ESD保护器件,主要应用于各类通信接口静电保护,如USB.HDMI ...