题意:
给一个n,求n个不同字母全排列构成的字典树节点个数(n <= 108 10 8 ),modulo 10000。
思路:
- 首先可以知道,对于一颗树n = k,节点个数是( ∑ki=0 ∑ i = 0 k n! / i!)+1。暴力算TLE。
- 然后开始转换成递推式(并不知道为什么要这么做,本来还想凑个矩阵乘法出来),设f[i] 表示n = i时除了根节点之外的节点个数,可以发现f[1] = 1,f[i] = i * (f[i-1] + 1)%10000。
- 继续发现规律:因为每个f[i]都可以被 i 整除,所以当 i 达到10000时f[10000] = 0001,等于又回到了1。所以在读入n时可以直接n %= 10000,然后O(n)递推,妥妥的跑过去了。
- 最后是输出问题,因为他说要取后四位,所以在10000以下就用printf(“%d”, f[n]+1),在10000以上就用printf(“%04d”, f[n]+1).
- 记录一个错误思路:f[i]能被所有小于等于i的数整除,然而因为递推式里那个万恶的+1,这是不成立的。
感谢gzx大佬
%%%
%%%
%%%
%%%
%%%
∑666i=233 ∑ i = 233 666 %%%