首先可以通过推算或是打表发现题目就是卡特兰数
如果知道要求什么了,甚至差不多要搞出来了,却离ac就差那么一点点,是相当郁闷的,不是吗?
一个大问题接踵而来,如何求卡特兰数第1000000项?
有个组合公式ans=C(N,2N)-C(N-1,2N)
直接分解质因数? TLE?!(MDT打了个质数表+常数优化然后0.7sAC了~囧)
更高级的方法?
LY想出了一个O(n*(1+1/2+1/3+1/4+...+1/n))的算法:
先做次筛选法,在算出质数的同时,记录a[i]为每个合数i是被哪个质数筛掉的
那么我们筛完之后,只需从N downto 1一遍就可以得到1~N的所有质因数了
在处理数i的时候,我们知道i是可以分解为a[i]*(i div a[i])的,那这次我就只把i的“任务数”算到a[i]上,而把其他的质因数的“任务”推到i div a[i]上,即给i div a[i]的“任务数”加上一个i的任务数,到时再处理;初始时每个数的任务数都是1
这样就可以完全线性统计1~n的质因数个数了,总的复杂度差不多就是(筛选法的复杂度+最后快速幂算答案的复杂度)
代码:
由于是考试(模拟考-_-!,并非当年考场)时编的,有点丑~~