HDU 2894 DeBruijin (数位欧拉)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2894
题目大意:旋转鼓的表面分成m块扇形,如图所示(m=8)。图中阴影区表示用导电材料制成,空白区用绝缘材料制成,终端a、b和c是3(k=3)处接地或不是接地分别用二进制信号0或1表示。因此,鼓的位置可用二进制信号表示。试问应如何选取这8个扇形的材料使每转过一个扇形都得到一个不同的二进制信号,即每转一周,能得到000到111的8个数。
那我们现在把旋转鼓的表面分成m块扇形,每一份记为0或1,使得任何相继的k个数的有序组(按同一方向)都不同,对固定的k,m最大可达到多少,并任意输出符合条件的一个这样的有序组。
第一问m达到的最大值为2^k。
第二问就是模拟一下旋转鼓接地线的旋转过程,每次旋转即删去第一个数,然后在最后加一个0(a<<1&((1<<k)-1))或1(a<<1&((1<<k)-1)+1),同时标记出现过的数字,保证每个出现的数字都不同。
因为所有数为0到2^k-1,对于任意给定的点a,将它与点a1=a<<1&((1<<k)-1)与点a2=a1+1分别连一条边,构成欧拉回路(每个点入度=出度=2),加一个vis数组确定每个数出现一次。因为结果需要按照字典序从小到大排,所以首先输出的必然是k个前导0,然后dfs判断0或1时先判0,再判1,逆序输出即可(dfs回溯)。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
const int N=; int k,cnt;
int ans[<<N];
bool vis[<<N]; void init(){
CLR(vis,false);
CLR(ans,);
cnt=;
} void euler(int st) {
int s1=(st<<)&((<<k)-);
int s2=s1+;
if (!vis[s1]){
vis[s1]=;
euler(s1);
ans[++cnt]=;
}
if (!vis[s2]) {
vis[s2]=;
euler(s2);
ans[++cnt]=;
}
} int main(){
while(~scanf("%d",&k)){
init();
euler();
printf("%d ",cnt);
//因为要求字典序最小,所以前k位都是0(前导零)
for(int i=;i<k;i++){
printf("");
}
for(int i=cnt;i>=k;i--){
printf("%d",ans[i]);
}
printf("\n");
}
return ;
}
HDU 2894 DeBruijin (数位欧拉)的更多相关文章
- HDU 1695 GCD (欧拉函数+容斥原理)
		GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ... 
- HDU 5430  Reflect(欧拉函数)
		题目: http://acm.hdu.edu.cn/showproblem.php?pid=5430 从镜面材质的圆上一点发出一道光线反射NNN次后首次回到起点. 问本质不同的发射的方案数. 输入描述 ... 
- hdu 5279 Reflect phi  欧拉函数
		Reflect Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_chi ... 
- HDU 1695 GCD(欧拉函数+容斥原理)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ... 
- hdu GuGuFishtion 6390 数论 欧拉函数
		题目:http://acm.hdu.edu.cn/showproblem.php?pid=6390 直接开始证明: 我们设…………………………………….....…...............………… ... 
- HDU 1787 GCD Again(欧拉函数,水题)
		GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ... 
- hdu 3501 Calculation 2 (欧拉函数)
		题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质 ... 
- hdu 1695 GCD(欧拉函数+容斥)
		Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ... 
- hdu 2814  快速求欧拉函数
		/** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ... 
随机推荐
- BZOJ2595:[Wc2008]游览计划——题解(插头dp)
			http://www.lydsy.com/JudgeOnline/problem.php?id=2595 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行 ... 
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
			在Unity Editor下,当选择Camera组件后,可呈现出Camera视口区域锥体,非常方便.但是当选择其他物体,如Cube后,就无法得知是否在Camera市口区内了,这里我找到了雨松MOMO的 ... 
- Classical Binary Search
			Find any position of a target number in a sorted array. Return -1 if target does not exist. 与题目 Firs ... 
- elasticsearch配合mysql实现全文搜索
			之前用了sphinx,发现很多东西很久都没更新过了,之前只是知道有elasticsearch这个东西,还以为是java才能用,所以一直没有去了解过,也许sphinx慢慢会被淘汰了吧. 前置条件:需要安 ... 
- 「Python」7个不一样的代码写法
			打印index 对于一个列表,或者说一个序列我们经常需要打印它的index,一般传统的做法或者说比较low的写法: 更优雅的写法是多用enumerate 两个序列的循环 我们会经常对两个序列进行计算或 ... 
- Java设计模式の模版方法模式
			概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的 ... 
- Ibatis的resultMap和查询数据的对应关系
			iBatis和MyBatis 中返回数据对应关系 直接进入主题,现在的项目改用MyBatis了,感觉跟iBatis还是不一样的,比如在判断空值上面,iBatis是有标签的<isNotEmpty& ... 
- 【Web】Struts之namespace
			ZZ:struts2学习:配置篇之namespace 在struts1中是没有命名空间这个概念的,通过命名空间我们可以将所有的action配置划分为一个个逻辑单元,每个单元都有它自己的标识前缀.命名控 ... 
- 数字配对(bzoj 4514)
			Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ... 
- 扫描线(线段树)+贪心  ZOJ 3953
			http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5572 Intervals Time Limit: 1 Second ... 
