2 条题解

  • 3
    @ 2025-11-15 23:12:49

    根据题意,把n写成二进制形式,前面补任意个0之后,判断是否回文,以及长度是奇数中间是1还是0,若是回文且长度为奇数时中间是0则可以构成

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    #define i64 long long
    
    int a[100]={0};
    
    void solve(){
    	for(int i=0;i<=33;i++) a[i]=0;
    	int n;
    	cin>>n;
    	int kk=0;
    	while(n){
    		kk++;
    		if(n%2){
    			a[kk]=1;
    		}
    		n/=2;
    	}
    	bool ok=0;
    	for(int i=kk;i<=kk+31;i++){
    		int l=1,r=i;
    		bool aa=1;
    		while(l<r){
    			if(a[l]!=a[r]){
    				aa=0;
    				break;
    			}
    			l++;
    			r--;
    		}
    		if((i)&1){
    			if(a[l]==1) aa=0;
    		}
    		if(aa){
    			ok=1;
    			break;
    		}
    	}
    	if(ok) cout<<"YES"<<'\n';
    	else cout<<"NO"<<'\n';
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
    
        int t=1;
        cin>>t;
    
        while(t--){
            solve();
        }
    
        return 0;
    }
    
    • 1
      @ 2025-11-18 13:49:33
      #include<iostream>
      using namespace std;
      int main()
      {
          ios::sync_with_stdio(0);
          cin.tie(0);
          cout.tie(0);
          int t;
          int n;
          cin>>t;
          while(t--)
          {
              int j=0;
              cin>>n;
              //特判0
              if(n==0)
              {
                  cout<<"YES"<<'\n';
                  continue;
              }
              char c[96]={'0'};
              //存储二进制
              while(n)
              {
                  int i=n%2;
                  c[j++]='0'+i;
                  n/=2;
              }
              int cnt=0;
              int fa=0;
              //找出c中前导0的个数
             //如8 1000,存储在c中为0001
            //我们要在c的后面加3个0
              for(int k=0;k<j;k++)
              {
                  if(c[k]=='0'&&fa==0)
                  {
                      cnt++;
                  }
                  if(c[k]!='0')
                  {
                      fa=1;
                  }
              }
              //加0
              while(cnt--)
              {
                  c[j++]='0';
              }
              //一共奇数位的话中间必须为0
              if(j%2==1)
              {
                  if(c[j/2]=='1')
                  {
                      cout<<"NO"<<'\n';
                      continue;
                  }
              }
              //判断是否回文
              fa=1;
              for(int i=0;i<=j/2;i++)
              {
                  if(c[i]!=c[j-1-i])
                  {
                      fa=0;
                      break;
                  }
              }
              if(fa)
              cout<<"YES"<<'\n';
              else
              cout<<"NO"<<'\n';
          }
          return 0;
      }
      
      
      
      • 1

      信息

      ID
      1197
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      45
      已通过
      11
      上传者