先打一个sg函数的表,找找规律,发现sg函数可以递归求解
打表代码如下
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; bool vis[N]; int sg[N]; int k; void init() { memset(sg,,sizeof(sg)); memset(vis,false,sizeof(vis)); sg[]=,sg[]=; ;i<=;i++) { memset(vis,,sizeof(vis)); )/k;j<i;j++) vis[sg[j]]=true; ;j<=;j++) if(vis[j]==false) { sg[i]=j; break; } } } int main() { ios::sync_with_stdio(false); while(cin>>k) { init(); ;i<=;i++) { printf(? '\n':' '); } puts(""); puts(""); } }
得到的一个结果
k= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]= sg[ ]=
当然k可以改来改去地试
再之后,如果异或和不为0,要特殊处理下,也是根据打表的规律,具体方法见代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; LL k; int n; LL a[N]; LL sg(LL x) { ||x==) ; ) )/k; return sg(x/k); } int main() { while(~scanf("%d%lld",&n,&k)) { LL ans=; ;i<=n;i++) { scanf("%lld",&a[i]); ans^=sg(a[i]); } // cout<<ans<<endl; if(ans) { int pos; LL y; ;i<=n;i++) { LL sgx=sg(a[i]),t=sgx^ans; pos=i; y=t+(t+k-)/(k-); // cout<<y<<' '<<(a[i]+k-1)/k<<endl; ) { if(y>=a[i]) break; )/k) { printf("Alice %d %lld\n",pos,y); ; } y=y*k+; } } printf("Alice %d %lld\n",pos,y); } else puts("Bob"); } }