个人比赛地址:http://vjudge.net/vjudge/contest/view.action?cid=51789#overview(附有代码)
problem A: Light OJ 1007
题目很水,就不说了。
problem B: Light OJ 1045
题意:给一个数n,求n!在K进制下写出来有多少位数字。(n最大1000000)
思路:利用log函数,看一个数x有多少位,直接求log(x)即可,然后加1就是答案;
所以在十进制下的话,log(n!)+1就是答案,这个式子又是等于 log(1)+log(2)+.......+log(n)+1;
所以问题就很简单了吧!最后要求K进制下,就是求logk(n!)+1=log(n!)/log(k)+1。
problem C: Light OJ 1189
题意:给定一个数n,把n表示成如下形式:n=x1!+x2!+...+xn!(xi<xjfor all i<j)(n可以高达10^18)
思路:主要思路是贪心,首先处理出1-20的阶乘,然后在阶乘里选数,直接从高位往低位贪;
简单证明:注意到1,2,6,24,120,720,每一个数前面所有数加起来都没有这个数大,也就是说如果当前这个数
选不了的话,那么往后面无论怎么选数都不可能比这个数大,所以贪心的思路是正确的。只需把阶乘从最大数
往最小数扫一遍,贪心选数即可。
problem D: Light OJ 1136
题意:求区间【A , B】内的数有多少个能被3整除。
思路:用纯数学的方法,我们都知道判断一个数n能否被3整除就是看它各位数的和是否能被3整除。因为连续的三个
的和一定能被3整除,所以:
第3k个数:一定能被3整除;
第3k+1个数:因为从第二个数到最后一个数的和一定能被3整除,所以加上1后肯定不能被3整除了。
第3k+2个数:因为从第3个数到最后一个数的和一定能被3整除,所以加上1+2=3后也能被3整除;
综上:所以1~k中能被3整除的有2*(k/3)+(k%3==2?1:0)个
problem C:Light OJ 1135
题意:给定数组,求数组下标从l到r的数内有多少个数能被3整除。
思路:就是一个裸的线段树的区间更新,区间询问,需要用到懒操作。