【发布时间】:2016-11-06 23:27:22
【问题描述】:
考虑一个长度为 N 的二进制序列 b。最初,所有位都设置为 0。我们定义了一个带有 2 个参数的翻转操作,flip(L,R),这样:
- 索引在 L 和 R 之间的所有位都被“翻转”,这意味着值为 1 的位变为值为 0 的位,反之亦然。更准确地说,对于 [L,R] 范围内的所有 i:b[i] = !b[i]。
- 超出指定范围的位不会发生任何事情。
您被要求确定可以使用 exactly K 翻转操作对任意给定数字取模获得的可能不同序列的数量,我们称之为 MOD 。
更具体地说,每个测试在第一行包含一个数字 T,即要给出的查询数。然后是T个查询,每个查询的形式为N、K、MOD,含义同上。
- 1≤N,K≤300 000
- T≤250
- 2 ≤ MOD ≤ 1 000 000 007
- 测试中所有 N-s 的总和≤600 000
- 时间限制:2秒
- 内存限制:65536 KB
示例:
输入:
1
2 1 1000
输出:
3
说明:
有一个查询。初始序列为00。我们可以进行以下操作:
翻转(1,1) ⇒ 10
翻转(2,2) ⇒ 01
翻转(1,2) ⇒ 11
因此,只需 1 次翻转就可以生成 3 种可能的序列。
我所做的一些快速观察,虽然我不确定它们是否完全正确:
如果 K 足够大,也就是说,如果我们有足够多的翻转次数可供使用,我们应该能够获得 2n 个序列。
如果 K=1,那么我们要寻找的结果是 N(N+1)/2。它也是 C(n,1)+C(n,2),其中 C 是二项式系数。
目前正在尝试一种蛮力方法,看看我是否能发现某种规则。我认为这是一些二项式系数的总和,但我不确定。
我还遇到过这个问题的一个更简单的变体,其中翻转操作只翻转一个指定的位。在这种情况下,结果是
C(n,k)+C(n,k-2)+C(n,k-4)+...+C(n,(1 或 0))。当然,也有 k > n 的特殊情况,但差别不大。无论如何,很容易理解为什么会发生这种情况。我想这是值得注意的。
【问题讨论】:
-
所以所有翻转都是非空范围?
-
@JaredGoguen 我想是的,是的。问题实际上并没有说明什么,但是如果您无法使用单次翻转(必须翻转一个空范围)获得序列“00”,那么我很确定您只能进行翻转非空范围。
-
我“几乎”有了解决问题的办法。我不怎么做的唯一部分是有效地计算以非素数为模的二项式系数。你对它感兴趣吗?
-
@kraskevich 当然。我认为,模乘逆可以解决这个问题。
-
看到这个类似的问题:stackoverflow.com/questions/37680863/…
标签: algorithm