1631 趣味琴盘(piano)

合肥市第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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值