题解
A AND Minimum Spanning Tree
参考代码:
#include<bits/stdc++.h> #define maxl 200010 using namespace std; int n,ans1; int mi[31]; int ans[maxl]; inline void prework() { scanf("%d",&n); } inline int find(int x) { for(int j=0;j<=30;j++) if((x&mi[j])==0) return mi[j]; } inline void mainwork() { ans1=0;int x; for(int i=2;i<=n;i++) { if(i&1) { x=find(i); if(x<=n) ans[i]=x; else ans1++,ans[i]=1; } else ans[i]=1; } } inline void print() { printf("%d\n",ans1); for(int i=2;i<=n;i++) printf("%d%c",ans[i],(i==n)?'\n':' '); } int main() { mi[0]=1; for(int i=1;i<=30;i++) mi[i]=mi[i-1]*2; int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }