2019 CCF CSP D1T1【格雷码】

这道题在考场上卡了个人 \(unsigned\) \(long\) \(long\) ,卡掉了十分,n=64直接爆炸ios

# include <cstdio>
# include <iostream>
# include <algorithm>
# include <set>
# include <vector>
# include <cstring>
# include <cstdlib>
# include <string>
# include <functional> 
# define N 1000
typedef unsigned long long LL;
inline LL re(){
	LL f=1,x=0;char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') {f=-1;}
		c=getchar();
	}
	while((c>='0')&&c<='9') {
		x=x*10+(c-'0');c=getchar();
		}
	return x*f;//考前打的 
} 
LL fast_pow(int p){
	LL ans=1,m=2;
	while(p){
		if(p&1) ans*=m;
		m*=m;
		p>>=1;
	}//毫无心义的快速幂 
	return ans;
}
int ans[N+42];
int main(){
	//freopen("code.in","r",stdin);
	//freopen("code.out","w",stdout);
	int n,len=0;LL sum=1,k,a=0;bool flag=true;//flag是用来标记是否颠倒 
	n=re();k=re();
	sum=fast_pow(n-1);
	/*
		考场上最后也没有想到,其实只要把第一次单独处理就行了 
	 */ 
	if(sum>k) {
				ans[len++]=0;
		}
	else{
		ans[len++]=1;
		k-=sum;
		flag=false;
	}//单独处理 
	while(len!=n){
		if(flag==true){
			if(sum/2>k) {
				ans[len++]=0;
				sum/=2;	
			}
			else{
				ans[len++]=1;
				sum/=2;
				k-=sum;
				flag=false;
			}
		}
		else {
			if(sum/2>k) {
				ans[len++]=1;
				sum/=2;
				flag=true;
			}
			else{
				ans[len++]=0;
				sum/=2;
				k-=sum;
			}
			
		}
	}
	for(int i=0;i<len;i++)
		printf("%d",ans[i]);//没什么好说 
	return 0;
}

祝各位考个好成绩~~~
反正我是凉了。spa

/——这是萌新的第一篇题解——/~悲伤的是没过~code

考完后当即写的,可是没过审核。

\(CCF\) 良心发现没卡 \(unsigned\) \(long\) \(long\)

相关文章
相关标签/搜索