トリプルI(ビット単位のOR演算と特性3)(以上2019頭の牛オフサマースクールキャンプ(第四)D)

例1:

入力:

2

3

7

出力:

1 3
2 3 6

説明:3 = 3、| 7 =。。(3 6)。

質問の意味:その位置またはデジタル入力Aの結果に応じて、できるだけデジタル出力、。

:(それを読むために山東ギャングコードを参照して、説明を読み取ることができない問題)まず第一に解決策:2つのだけの奇妙な現象があり、二進数である(私の定義は最初0で、それは偶数)と2 1、それぞれ偶数ビット及び奇数ビットで、この数は3の倍数でなければなりません。偶数ビット及び奇数ビットの数字(A> 3)が1であり、そして数1%3 == 1として、1以上である場合にのみ偶数ビット1~3%に取ります== 0;%3 == 2は、奇数のビットのみ1%3 == 0を取りました。

図1に示すように、入力は、次に、3の倍数、直接出力される場合。

入力が3の倍数でない場合は2、奇数ビットで二進数と位置を記録の数と偶数ビットは、次のアクション1:

奇数ビット及び偶数ビット1が存在する場合、ビルダーNUM1 = 0、NUM2 =、及び場合%3 == 1は、それぞれに1ビットも離れNUM2、奇数ビット及びNUM1に偶数ビット1既存;%3 == 2と、各偶数ビット及び奇数ビット既存のNUM1、奇数ビットに1離れるNUM2であろう。

偶数ビット、奇数または上の唯一の位置がある場合、同様にNUM1 = 0、NUM2 = A構成、及び徐々にNUM2%3 == 0になるまで、上に存在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