XJOI字典树

题意:

给一个n,求n个不同字母全排列构成的字典树节点个数(n <= 108 10 8 ),modulo 10000。

思路:

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

感谢gzx大佬

%%%

%%%

%%%

%%%

%%%
666i=233 ∑ i = 233 666 %%%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值