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\)

相關文章
相關標籤/搜索