题意:输入n,k表示n个人,第k个第一个离开圆环,之后n行,每行一个名字和一个数字m,表示从这个人开始顺时针(数字大于0)或逆时针(数字小于0)第m个人离开圆环。每个人离开时会有一个得分,得分=F(离开次序i); F(i)=能整除i的数的个数;求这个人的名字和得分。
思路:首先打表枚举[1,500000]的F(i); 然后模拟求这个人的名字,对于[1,n]中,求出是F(i)最大的i值,模拟i次离开就行了。人数比较多,直接模拟肯定不行,需要借助线段树(树状数组)直接计算出要离开圆环的人的坐标,线段树中维护的是这个区间中还剩下几个人。
很多人都把反素数表打了出来,我直接在代码中计算的,只会耗费大约300MS。
我自己写的(2700MS):
#include
#include
#include
#include
#include
#include
#include
看了别人写的后改进的(1700MS,把反素数表打出来还能再节省300MS):
#include
#include
#include
#include
#include
#include
#include