hdu 4768 Flyer (异或操作的应用)
2013年长春网络赛1010题
继巴斯博弈(30分钟)签到后,有一道必过题(一眼即有思路)。
思路老早就有(40分钟):倒是直到3小时后才被A掉。期间各种换代码姿态!
共享思路:
unlucky student flag 如果存在,有且只有one。flyers为基数;
其他student 为偶数。很容易想到以前做过的一道异或题。
过程:
(1)通过异或找unlucky。
(2)如果找到,再通过分发 flyers的规律取余操作确定 flyers的个数;
由于第二个条件出现了bug,但确信思路比对;所以各种换姿势,Wrang到想死,又各种找tricks。
(期间自然也有在线管理员的ansers的误导)。直到最后让队友完全了解思路才找到bug,然后A掉。
#include<stdio.h> int main() { int i,n; while(scanf("%d",&n)!=EOF) { __int64 ans=0; int a[21000],b[21000],c[21000]; for(i=0; i<n; i++) { scanf("%d%d%d",&a[i],&b[i],&c[i]); int x=a[i]; while(x<=b[i]) { ans=ans^((__int64)x); x+=c[i]; } } int js=0; if(ans) { for(i=0;i<n;i++) { if(ans>=a[i]&&ans<=b[i]&&(ans-a[i])%c[i]==0)js++; //ans>=a[i]&&(ans-a[i])%c[i]==0最初写这样。该死的小bug //也怪自己改错的重心出了问题,以为是tricks。~~o(>_<)o ~~ } printf("%I64d %d\n",ans,js); } else printf("DC Qiang is unhappy.\n"); } return 0; }