题解 P1161 【开灯】

雨竹

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