雨竹
2015-08-14 15:15:52
只有P党,只有模拟,在这里提醒大家一下,此题最好的解法应该是位运算。
有一种叫做“异或”的运算,pascal是xor,C是^
关于它的更多用法,你们可以自行百度,这里只需要知道:
异或就是把两个数拆成二进制,一位一位比较,某一位上一样返回0,不一样返回1。
一个数异或它本身得到0(因为每一位都一样全部返回0)
因此我们只需要设ans=0 然后把所有的数异或一遍。因为只有一盏灯是开的,也就是说,其他编号出现的次数都是成对的,异或完都是0,剩下的那一个与0异或得它本身。因此最后ans就是结果。
放上代码吧
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,t;
double a;
int main()
{
int ans=0;
scanf("%d",&n);
while (n--)
{
scanf("%lf",&a);//out f
scanf("%d",&t);
for (int i=1;i<=t;i++)
{
int x=(int)floor(a*i);
ans^=x;
}
}
printf("%d",ans);
return 0;
}