您好,匿名用户
随意问技术百科期待您的加入

错排序列第N项模M=?

0 投票
错排递推式:f(n)=(n-1)*(f(n-1)+f(n-2)) f(1)=0,f(2)=1

求f(n)%m,m<=1e5,n<=1e9,n,m为整数。

网上有人说循环节长度为2*m,起始位置是f(1),所以直接求f(n%(2*m))。对吗?为什么。

用户头像 提问 2014年 2月15日 @ Shen 上等兵 (318 威望)
分享到:

1个回答

0 投票
 
最佳答案

~~~ #UPDATE: 又仔细想了下 最后推导似乎有问题 略囧 所以仅供参考思路了 ~~~

----

你给出的这个“错排递推公式”,实际上有一个“直接”的计算公式:

f(n) =  n! * ((-1)^0/0! + (-1)^1 / 1! + (-1)^2 / 2! + ... + (-1)^n*1/n!)

已知

x = aX + b
y = cY + d
(x + y) % m = (aX + b + cY + d) % m = (b + d) % m = (X % m + Y % m) % m

g(n) = f(n) % m

则有

g(2m + n) = ((2m + n)! * (
[1]      -1^0    / 0!    + (-1)^1      / 1!      + ... + (-1)^(m-1)  / (m-1)!
[2]  + (-1)^m    / m!    + (-1)^(m+1)  / (m+1)!  + ... + (-1)^(2m-1) / (2m-1)!
[3]  + (-1)^(2m) / (2m)! + (-1)^(2m+1) / (2m+1)! + ... + (-1)^(2m+n) / (2m+n)!
    )) % m

由于 ((2m + n)! * 任意一个前2m项) % m == 0,所以前两行可以消掉(这个很容易看出来的吧?)

g(2m + n) 
  = ((2m + n)! * (
      (-1)^(2m) / (2m)! + (-1)^(2m+1) / (2m+1)! + ... + (-1)^(2m+n) / (2m+n)!
     )) % m
~~~ 由于 (-1)^2m == 1 ~~~
  = ((2m + n)! * (
      (-1)^0 / (2m)! + (-1)^1 / (2m+1)! + ... + (-1)^n / (2m+n)!
     )) % m
  = ((-1)^0 / n! + (-1)^1 / (n-1)! + ... + (-1)^n / 0!) % m

这里已经很接近你说的结论了,由于n是奇偶的时候会影响这里的正负号,而我前面没有证明 (x - y) % m 的公式,但是由于实际上前2m项减去后n项毫无疑问是正数(中间这些琐碎的证明略掉),所以最终结论就是:

 g(2m + n) == g(n) 
用户头像 回复 2014年 2月12日 @ Galio 上等兵 (289 威望)
选中 2013年 9月7日 @Shen
提一个问题:

相关问题

0 投票
1 回复 24 阅读
0 投票
1 回复 40 阅读
用户头像 提问 2012年 12月1日 @ Morgana 上等兵 (251 威望)
0 投票
0 回复 21 阅读
用户头像 提问 2013年 11月4日 @ Virgo 上等兵 (284 威望)
0 投票
1 回复 31 阅读
用户头像 提问 2013年 11月7日 @ Sion 上等兵 (319 威望)
0 投票
1 回复 32 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...