题意:有n个小朋友顺时针围着坐了一圈,每个人手里都有一个数字。游戏从第k个小朋友开始,首先,第k个小朋友退出游戏,如果退出游戏的小朋友手上的数字是正整数A,则从他的左手边的第A个小朋友退出游戏,如果退出游戏的小朋友手上的数字是负整数-A,则从他的右手边的第A个小朋友退出游戏(注意,因为顺时针,左手边就是往后,右手边就是往前)。第i个退出的小朋友可以获得a(i的约数的个数)的糖果,问最多糖果的小朋友的名字,并且他有多少糖果。
刚开始看这题题目的时候,哇。。看不懂。。最后求的东西不知道是什么,上网搜了一下大佬的题解,才知道,求的好像是翻素数。。。但是。。。重点在于。。我不会啊。。。所以还是老老实实初始化了一下,然后说这题是用线段树做,一直没懂线段树要怎么用上去,看了题解才明白。。。太菜了太菜了。。
思路:先初始化一下5e5+10每个数字的约数有几个(大佬就直接打表反素数。。),我们可以反过来想,可以用类似于素数打表的那个。接着用线段树去求每个小朋友的位置。这题线段树用的比较特殊(代码注释),在于修改的部分其它都差不多。
反素数:对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反素数。例如,整数1,2,4,6等都是反素数。
AC代码: