格雷码

P2328 [SCOI2005]超级格雷码

不问归期 提交于 2019-12-05 10:55:27
P2328 [SCOI2005]超级格雷码 暴力出奇迹喵! 这是一道模拟题 你会发现和 P5657 格雷码【民间数据】 有异曲同工之妙,这道题直接按照上边链接题目的操作步骤 暴力模拟 就可以啊 我们观察 n=2n=2 n = 2 时候格雷码是这样操作的 在线引用链接题面描述: 带大家模拟一下: 比如 n=4 先生成1位: 也就是 0,1,2,3 然后生成两位: 也就是先把上一层的复制下来,顺序排好,然后再逆序排一遍,然后再顺序排一遍,再逆序排一遍。。。然后一小层作为一个分界,每一层的最左端都依次加上相应的字符 0,1,2,,,n-1 00 , 01 , 02 , 03 , 13 , 12 , 11 , 10 , 20 , 21 , 22 , 23 , 33 , 32 , 31 , 30 n,B取其他值的时候也是一样的模拟 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<queue> using namespace std; typedef long long ll; inline int read() { int ans=0; char last=' ',ch

题解【P5657 格雷码】

99封情书 提交于 2019-12-04 18:51:38
CSP-S 2019 D1T1 考场上第一遍读题的时候感觉不是很一眼……不是很符合D1T1的气质 之前完全没听说过格雷码是什么玩意,还是我太菜了 仔细读题后发现应该是有规律可循的 赛后据说有$O(1)$算法,反正我不会 ------------ 思路分析 写出一些小位数的格雷码全排列,再根据格雷码的生成算法,可以有以下算法: 1. 对于$x$位第$k$个格雷码,若$k\geq2^{x-1}$,则显然该格雷码是由$x-1$位的第$2^{x-1}-(k-2^{x-1}+1)=2^x-k-1$个格雷码前面加上一个1得来的;否则,该格雷码是由$x-1$位的第$k$个格雷码前面加上一个0得来的 1. 重复步骤1,直到$x=0$。 具体实现 模拟即可,可以边模拟边输出。 看一眼数据范围,特地提示了$5$分的$unsigned$ $long$ $long$。。。所以记得开 求幂的时候也要注意精度问题,可以使用快速幂 #include<iostream> #include<cstdio> #define ull unsigned long long using namespace std; int n; ull k; ull fastpow(ull a,ull b) { ull ans=1; while(b) { if(b&1) ans*=a; b>>=1; a*=a; } return ans;

P5657 格雷码

对着背影说爱祢 提交于 2019-12-04 16:21:48
思路 考场上的递归思路 每次向下递归的时候判断是左半边还是右半边即可 注意向右半边递归之后下一层序列要反转过来即可 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <iostream> using namespace std; void solve(unsigned long long n,unsigned long long k,unsigned long long rev=0){ if(rev) k=((1ULL<<(n))-1)-k; // cout<<n<<' '<<k<<' '<<rev<<endl<<endl; if(n==1){ if(k==0) printf("0"); else printf("1"); return; } if(k>((1ULL<<(n-1))-1)){ printf("1"); solve(n-1,k-((1ULL<<(n-1))),1); } else{ printf("0"); solve(n-1,k,0); } } unsigned long long n,k; int main(){ cin>>n>>k; solve(n,k); return 0; } 来源: https://www.cnblogs.com/dreagonm/p/11873923

[CSP-S 2019]格雷码

♀尐吖头ヾ 提交于 2019-12-04 16:17:43
[CSP-S 2019]格雷码 题目大意: 格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间 恰好 有一位 不同 ,特别地,第一个串与最后一个串也算作相邻。 \(n\) 位格雷码不止一种,下面给出其中一种格雷码的生成算法: \(1\) 位格雷码由两个 \(1\) 位二进制串组成,顺序为: \(0\) , \(1\) 。 \(n+1\) 位格雷码的前 \(2^n\) 个二进制串,可以由依此算法生成的 \(n\) 位格雷码(总共 \(2^n\) 个 \(n\) 位二进制串)按 顺序 排列,再在每个串前加一个前缀 \(0\) 构成。 \(n+1\) 位格雷码的后 \(2^n\) 个二进制串,可以由依此算法生成的 \(n\) 位格雷码(总共 \(2^n\) 个 \(n\) 位二进制串)按 逆序 排列,再在每个串前加一个前缀 \(1\) 构成。 综上, \(n + 1\) 位格雷码,由 \(n\) 位格雷码的 \(2^n\) 个二进制串按顺序排列再加前缀 \(0\) ,和按逆序排列再加前缀 \(1\) 构成,共 \(2^{n+1}\) 个二进制串。另外,对于 \(n\) 位格雷码中的 \(2^n\) 个 二进制串,我们按上述算法得到的排列顺序将它们从 \(0 \sim 2^n - 1\) 编号。 现在给出 \(n\) , \(k\)

【解题报告】CSP2019-S D1T1 格雷码

∥☆過路亽.° 提交于 2019-12-04 16:08:55
题目链接: https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊。 基本思路 因为n位格雷码的前2 n-1 位就是n-1位格雷码前面加了一位‘0’,所以可以把它们近似的看作和n-1位格雷码相同 寻找第k位格雷码是通过哪一个格雷码得出的,以4位格雷码为例,因为第10号格雷码是由5号的前面加了“1”得到的,所以10号与5号对应   如果k小于2 n-1 ,即最高位为0,它与本身对应 按上述方法求出在n-1位格雷码中刚才算出的对应编号的值,然后在前面加上“0”或“1” 因为数据范围位2 64 ,所以要用 unsigned long long 。 代码: #include <bits/stdc++.h> #define ull unsigned long long using namespace std; int n, n1, n2, shuzu[10086]; ull k; ull mypow(int a, int b){ ull ans=1; for(int i=0; i<b; i++) ans*=a; return ans; } void digui(ull x){ if(x==0){ shuzu[0]=0; return; } else if(x==1){ shuzu[0]=1; return; } else{ if(x>=n1/2){

[bzoj1081]超级格雷码

廉价感情. 提交于 2019-12-03 23:24:41
手动模拟一组样例,可以理解大致应该如何操作 具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,b,a[105],flag[105]; 4 void write(){ 5 for(int i=1;i<=n;i++) 6 if (a[i]<10)printf("%d",a[i]); 7 else printf("%c",a[i]-10+'A'); 8 printf("\n"); 9 } 10 int main(){ 11 scanf("%d%d",&n,&b); 12 for(int i=1;i<=n;i++)flag[i]=1; 13 while (1){ 14 write(); 15 int i=1; 16 for(;i<=n;i++) 17 if ((0<=flag[i]+a[i])&&(flag[i]+a[i]<b)){ 18 a[i]+=flag[i]; 19 for(int j=i-1;j;j--)flag[j]*=-1; 20 break; 21 } 22 if (i>n)break; 23 } 24 } View Code 来源: https://www.cnblogs.com/PYWBKTDA/p

有限状态机设计

孤人 提交于 2019-11-28 09:47:32
数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机。 Moore状态机   其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。这是一个典型的Moore状态机的状态跳转图,x、y、z是输入,a、b、c是输出。      Mealy状态机   它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态图中每条转移边需要包含输入和输出的信息。 状态编码   数字逻辑系统状态机设计中常见的编码方式有:二进制码(Binary码)、格雷码(Gray码)、独热码(One-hot码)以及二一十进制码(BCD码)。   格雷码的特点:相邻的两个码组之间仅有一位不同。 普通二进制码与格雷码之间可以相互转换。   二进制码转换为格雷码:从最右边一位起,一次与左边一位“异或”,作为对应格雷码该位的值,最左边的一位不变(相当于最左边是0)。   格雷码转换为二进制码:从左边第二位起,将每一位与左边一位解码后的值“异或”,作为该解码后的值(最左边的一位依然不变)。   独热码又分为独热1码和独热0码,是一种特殊的二进制编码方式。当任何一种状态有且仅有一个1时,就是独热1码,相反任何一种状态有且仅有一个0时,就是独热0码。 状态机的描述   状态机有三种描述方式:一段式状态机、两段式状态机

异步FIFO结构及FPGA设计 ---跨时钟域设计

心已入冬 提交于 2019-11-28 02:34:21
http://hi.baidu.com/hieda/blog/item/e8f8752465afb337c895593c.html 异步FIFO 结构及FPGA 设计 吴自信,张嗣忠. 单片机及嵌入式系统应用,2000 摘要 :首先介绍异步FIFO的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法;在传统设计的基础上提出一种新颖的电路结构并对其进行综合仿真和FPGA实现。 1、异步FIFO介绍 在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟。多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步 FIFO(First In First Out)是解决这个问题一种简便、快捷的解决方案。使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。在网络接口、图像处理等方面, 异步FIFO得到了广泛的应用。 异步FIFO是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。本文介绍解决这一问题的一种方法。 由图1可以看出:整个系统分为两个完全独立的时钟域——读时钟域和写时间域;FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。在写时钟域部分