2017级新生周赛(七)题解
A.大数加法的模拟从后往前加如果大于等于10就向前进位http://paste.ubuntu.com/26105658/B.用排除法总共有mn放置方法,不会发生不开心的情况:一个箱子有m种放法,其他箱子都有m-1种放法所以是m*(m–1)(n-1)。两个作差取余可能出现负数只要加上模数就好。发现m,n很大循环相乘会超时,所有用快速幂的方法时间复杂度是O(logn),原理参考http://blog.csdn.net/xiaotan1314/article/details/47090773或者其他的资料http://paste.ubuntu.com/26111508/C.假设1-n中是a和a的倍数的编号集合是A,b和b的倍数的编号集合是B,c和C的倍数的编号集合是C,如图所示,显然+位置箱子打开的,-位置箱子是关闭的,这些位置的和应该是AUBUC–AB–AC–BC+3ABC(AB代表A和B的交集即既是a的集合也是b的集合其他类似),加3ABC是因为AB,AC,BC中都包含ABC所有要加上3ABC,AUBUC=A+B+C–AB–AC–BC+ABC,带入得A+B+C-2(AB+AC+BC)+4ABC,剩下的就是求他们值了,A,B,C易得分别是n/a,n/b,n/c。AB是将n除以a和b的最小公倍数,即n/(ab/gcd(a,b),即ngcd(a,b)/(ab),为了防止超出longlong范围,可化为ngcd(a,b)/a/b(实际上是不会超的TAT),以此类比可得AC,BC,ABC。如果没有交集那么交集即为0,没有影响。http://paste.ubuntu.com/26105714/D.贪心先把每种糖果的单个价格算出来,然后从大到小排序,从大的开始如果能拿走就拿走,直到不能拿的时候跳出循环http://paste.ubuntu.com/26105723/E.如果n是偶数,那么一定是后手赢,因为后手模仿先手的每一步即可。如果n是奇数,如果先手能够分当前的堆,那么他一定能够分出一定数目的不能继续操作的堆,所以相当于后手面对了先手偶数的局面,那么先手赢,如果不能分了,那么先手直接不能操作,后手就赢了。 http://paste.ubuntu.com/26105731/F.简单的字符串模拟题(数据范围错了,比赛中已更正,不好意思)http://paste.ubuntu.com/26112487/G.由于阶乘要用到的数很大,而且很费时,因此不便直接乘,经分析可知,要求最后一位数并不用全部求出,只需保留最后几位非零位即可解决,求第一位数,两边取常用对数:,当n比较大的时候用这个,n比较小的时候精度较小中间细节注意一下,或者模拟阶乘的过程。http://paste.ubuntu.com/2612889

浙公网安备 33010602011771号