例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 }