트리플 I (비트 OR 연산과 특성 3) (여름 학교 캠프 오프 이상 2019 소 (네 번째) D)

예 1 :

입력 :

(7)

출력 :

1 3
2 3 6

설명 : 3 = 3 | = 7.. (3-6..).

질문의 의미 가능한 디지털 출력이 적은 해당 위치 또는 디지털 입력의 결과에 따라.

:( 설명을 읽을 수있는 문제에 대한 해결책은, 산동 갱스터 코드) 우선을 읽어 볼 두 가지 이상한 현상이있다, 즉, 짝수, 이진 자리 (나의 정의는 첫째 0이다) 만 (2) (1)는, 각각 짝수 및 홀수 비트 비트에서,이 수는 3의 배수이어야한다. 짝수 비트 및 홀수 비트에서 다수의 (a> 3)이 1이고, 숫자 1은 3 % == 1과 1 이상의 경우, 단지 짝수 비트 1 내지 3 %로 취 == 0; % 3 == 2 홀수 비트에 1 % 내지 3 == 0했다.

도 1을 참조하면, 입력 한 다음 3의 배수, 직접 출력되는 경우;

입력은 세 가지의 배수가 아닌 경우 2, 홀수 비트의 이진수과 기록 위치의 수 및 짝수 비트는, 다음 액션 1 :

홀수 비트 및 짝수 비트 1이 존재하는 경우, 빌더 NUM1 = 0 NUM2 = A 및 만약 % 3 == 1이면 각각에 1 비트라도 얻어 NUM2, 홀수 비트 및 짝수 비트의 NUM1 1 기존; % 3 == 2 멀리 홀수 비트 NUM2, 짝수 비트 각각 NUM1와 홀수 비트에 1이 될 것 경우 일 기존;

짝수 비트 홀수거나 단지 하나의 위치에있는 경우, 마찬가지로 NUM2 % 3 == 0까지 NUM1 = 0 NUM2가 = A, 및 점진적에 NUM1의 NUM2 1을 기존에 1을 구성 NUM2까지는 1 정지 상기 구성을 완료 NUM1 % 3 = 0의 끝까지 NUM1 1 기존 계속했다.

AC 코드 :

 

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define pb push_back
 4 using namespace std;
 5 LL num1,num2;
 6 void solve(LL x)
 7 {
 8     num1=0,num2=x;
 9     vector<int>odd,even;
10     for(int i=0;i<=63;i++){//将奇数位和偶数位上的1的位置取出并保存
11         if((x>>i)&1){
12             if(i%2)odd.pb(i);
13             else even.pb(i);
14         }
15     }
16     if(odd.size()&&even.size()){//奇数位和偶数位上都存在1的情况
17         if(x%3==1){
18             num2^=(1LL<<even[0]);
19             num1^=(1LL<<even[0]);
20             num1^=(1LL<<odd[0]);
21         }
22         else{
23             num2^=(1LL<<odd[0]);
24             num1^=(1LL<<even[0]);
25             num1^=(1LL<<odd[0]);
26         }
27     }
28     else if(odd.size()){//只有奇数位上存在1的情况
29         int i;
30         for(i=0;i<odd.size();i++){
31             num1^=(1LL<<odd[i]),num2^=(1LL<<odd[i]);
32             if(num2%3==0){
33                 i++;break;
34             }
35         }
36         for(;i<odd.size();i++){
37             if(num1%3==0)break;
38             num1^=(1LL<<odd[i]);
39         }
40     }
41     else{//只有偶数位上存在1的情况
42         int i;
43         for(i=0;i<even.size();i++){
44             num1^=(1LL<<even[i]),num2^=(1LL<<even[i]);
45             if(num2%3==0){
46                 i++;break;
47             }
48         }
49         for(;i<even.size();i++){
50             if(num1%3==0)break;
51             num1^=(1LL<<even[i]);
52         }
53     }
54 }
55 int main()
56 {
57     LL t,n;
58     scanf("%lld",&t);
59     while(t--){
60         scanf("%lld",&n);
61         vector<LL>num;
62         if(n%3==0){
63             num.pb(n);
64         }
65         else {
66             solve(n);//a%3!=0的情况下进行构造。
67             num.pb(num1);num.pb(num2);
68         }
69         if(num.size()==1)
70             printf("1 %lld\n",num[0]);
71         else if(num.size()==2)
72             printf("2 %lld %lld\n",num[0],num[1]);
73     }
74     return 0;
75 }

 

추천

출처www.cnblogs.com/Aamir-Dan/p/11263280.html