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.去掉重复的数字,总是一个固定的数字循环在不断重复:

\[0,1,2,\cdots,B-1,B-1,\cdots,1,0
\]

2.从右往左数第 \(i\) 列数字在同一循环节里出现的次数为 \(B^{i-1}\) ;

3.这可以用除法以及取模哟~

咱继续实验,当 \(n=2,B=3\) 时:

00 01 02 12 11 10 20 21 22

这一行咱横着看,是不是依旧符合那个规律?

对于第 \(i\) 个出现的格雷码,对于它的第 \(j\) 位上数字编号(不是字母,咱多个函数转一下字符就行):

1.计算它是属于第几个出现的字符,这里咱先除去每个循环节重复的字符数,找到它是第几个不重复的字符

\[x=i\%(B^{j-1})?i/(B^{j-1})+1:i/(B^{j-1})
\]

2.计算它在每个循环节中的位置,每个循环节长度为 \(2*B\)

\[x\%=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]超级格雷码(找规律填空)的更多相关文章

  1. P2328 [SCOI2005]超级格雷码

    P2328 [SCOI2005]超级格雷码 暴力出奇迹喵! 这是一道模拟题 你会发现和 P5657 格雷码[民间数据]有异曲同工之妙,这道题直接按照上边链接题目的操作步骤 暴力模拟 就可以啊 我们观察 ...

  2. bzoj1081: [SCOI2005]超级格雷码(dfs)

    1081: [SCOI2005]超级格雷码 题目:传送门 题解: 又是一道水题... 因为之前做过所以知道规律: 如n=2 B=3: 00 10 20    21 11 01    02 12 22 ...

  3. 1081: [SCOI2005]超级格雷码

    1081: [SCOI2005]超级格雷码 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 301  Solved: 159[Submit][Statu ...

  4. 【BZOJ1081】[SCOI2005]超级格雷码(搜索)

    [BZOJ1081][SCOI2005]超级格雷码(搜索) 题面 BZOJ 洛谷 题解 找个规律吧,自己随便手玩一下,就按照正常的顺序枚举一下,发现分奇偶位考虑正序还是逆序就好了. #include& ...

  5. BZOJ1081[SCOI2005]超级格雷码

    Description 著名的格雷码是指2n个不同n位二进制数(即0~2n-1,不足n位在前补零)的一个排列,这个排列满足相邻的两个二进制数的n位数字中最多只有一个数字不同(例如003和001就有一个 ...

  6. [BZOJ 1081] [SCOI2005] 超级格雷码 【找规律】

    题目链接:BZOJ - 1081 备注:此题BZOJ上貌似没有 spj ,要把一般顺序的每个格雷码倒着输出...比如 0102 输出为 2010 题目分析 就是按照 Gray 码的生成方法写前几个出来 ...

  7. [SCOI2005]超级格雷码

    题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...

  8. [bzoj1081]超级格雷码

    手动模拟一组样例,可以理解大致应该如何操作具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> ...

  9. 格雷码原理与Verilog实现

    格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...

随机推荐

  1. sublime settings

    { "font_face": "Monaco", // 编辑器的字体 "font_size": 13, // 字号 "highli ...

  2. MVC 生成安全验证码(例:用于登陆验证)(转)

    ---------html <td>验证码:</td> <td> <img src="/Login/CheckCode?ID=1" id= ...

  3. R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操

    今天要给大家分享的统计方法是马尔可夫多态模型,思路来源是下面这篇文章: Ward DD, Wallace LMK, Rockwood K Cumulative health deficits, APO ...

  4. [USACO08OPEN]牛的街区Cow Neighborhoods

    题目描述: luogu 题解: 技巧题. 曼哈顿距离:$|x1-x2|+|y1-y2|$ 切比雪夫距离:$\max(|x1-x2|,|y1-y2|)$ 曼哈顿距离转切比雪夫距离:$(x,y)-> ...

  5. Mybatis配置错误:java.lang.ExceptionInInitializerError

    情况一:配置文件,无法被导出或者生效 修改前: 修改后: 究其原因,这是由于Maven的约定大于配置,导致我们写的配置文件,无法被导出或者生效的问题,解决方案: 在pom.xml文件中配置导出非res ...

  6. gofs使用教程-基于golang的开源跨平台文件同步工具

    概述 gofs是基于golang开发的一款开箱即用的跨平台文件同步工具,开源地址如下:https://github.com/no-src/gofs,欢迎点个Star或者提交Issue和PR,共同进步! ...

  7. 面试官:volatile关键字用过吧?说一下作用和实现吧

    volatile    可见性的本质类似于CPU的缓存一致性问题,线程内部的副本类似于告诉缓存区 面试官:volatile关键字用过吧?说一下作用和实现吧 https://blog.csdn.net/ ...

  8. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 ?

    面试官:想了解对 ES 集群的运维能力. 解答: 1.关闭缓存 swap; 2.堆内存设置为:Min(节点内存/2, 32GB); 3.设置最大文件句柄数: 4.线程池+队列大小根据业务需要做调整: ...

  9. Homebrew 卸载后重新安装mysql

    1.卸载https://blog.csdn.net/liuxw1/article/details/81434005 https://jingyan.baidu.com/article/5553fa82 ...

  10. 【STM32】MDK中寄存器地址名称映射分析

    对于MCU,一切底层配置,最终都是在配置寄存器 51单片机访问地址 51单片机经常会引用一个reg51.h的头文件.下面看看它是怎么把名字和寄存器联系在一起的: 1 sfr p0=0x80; 2 p0 ...