合肥市第30届信息学竞赛(2013年)
不许抄袭,一旦发现,直接清空经验!
题目描述 Description
有一个非常好玩的钢琴,它拥有一个奇特的琴盘,琴盘中的键可以无限增加,从左到右依次编号为1,2,3,4,……。
每一键只有两种可能的状态,弹起或者按下。如果按一下某一个键盘,那么这个键盘的状态将发生改变:如果原来是按下,将变成弹起;如果原来是弹起,将变成按下。
在刚开始的时候,所有的键盘都是按下的。
牛牛每次可以进行如下的操作:
指定两个数:a,t(a为实数,t为正整数)。将编号为[a],[2 * a],[3 * a],……,[t * a]的键盘各按一次。其中[k]表示实数k的整数部分,例如[1.554555]为1。
在牛牛进行了n次操作后,他突然发现,这个时候只有一个键盘是弹起的,牛牛很想知道这个键盘的编号,可是这键盘离牛牛太远了,他看不清编号是多少。
幸好,牛牛还记得之前的n次操作。于是牛牛找到了你,你能帮他计算出这个弹起的键盘的编号吗?
输入描述 Input Description
第一行一个正整数n,表示n次操作。
接下来有n行,每行两个数:ai,ti。其中ai是实数,小数点后一定有6位,ti是正整数。
输出描述 Output Description
仅一个正整数,那个弹起的键盘的编号。
样例输入 Sample Input
3 1.618034 13 2.618034 7 1.000000 21
样例输出 Sample Output
20
数据范围及提示 Data Size & Hint
记T=t1+t2+t3+……+tn。
对于30%的数据,满足T<=1000
对于80%的数据,满足T<=200000
对于100%的数据,满足T<=2000000
对于100%的数据,满足n<=5000,1<=ai<1000,1<=ti<=T
数据保证,在经过n次操作后,有且只有一个键盘是弹起的,不必判错。
分析
看到这题,大家想到了什么?对,模拟!模拟可以解决!
然后......
对于30%的数据,满足T<=1000
对于80%的数据,满足T<=200000
对于100%的数据,满足T<=2000000
对于100%的数据,满足n<=5000,1<=ai<1000,1<=ti<=T
这严重后果超时啊!
现在,我们来学习一个概念:异或消消乐
1^1=0
1^0=1
0^0=0
a^a=0
a^a^a=a
也就是说,偶数个数异或,结果是0,奇数个数异或,结果是它本身!
回到题目,只有一个弹起的按键,所以我们可以把输入的数字处理后(是小数)异或,出现偶数次的消掉了,只剩下一个奇数次的,这就是答案!
AC CODE
#include<bits/stdc++.h>
using namespace std;
int ans,n,t;
double a;
int main(){
cin>>n;
while(n--){
cin>>a>>t;
for(int i=1;i<=t;i++){
ans^=(int)(i*a);
}
}
cout<<ans;
return 0;
}