题目
简化题意:
求 1 , 2 , ⋯   , n 1,2,\cdots,n 1,2,⋯,n中多少个长为 m m m的序列 a a a满足:
- a 1 = 1 , a m = n a_1 = 1, a_m = n a1=1,am=n
-
∀
i
,
a
i
+
1
−
a
i
≥
k
\forall i, a_{i+1}-a_i \geq k
∀i,ai+1−ai≥k
求方案数的奇偶性,数据有 T T T组,满足:
n , m , q ≤ 1 0 9 , T ≤ 2 ∗ 1 0 6 n,m,q \leq 10^9, T\leq 2*10^6 n,m,q≤109,T≤2∗106
样例输入
3
10 3 2
5 3 1
15 5 3
样例输出
No
Yes
No
题解
- 考虑
k
=
1
k=1
k=1
方案数显然为 ( n − 2 m − 2 ) \binom{n-2}{m-2} (m−2n−2) - 考虑
k
=
̸
1
k =\not 1
k≠1,即
k
≥
1
k \geq 1
k≥1
根据题意分析:令所选出的数字集合为 b i {b_i} bi,对于所选集合的每个数字都应满足 b i + 1 − b i ≥ k b_{i+1}-b_i \geq k bi+1−bi≥k,那么在原本的 a i {a_i} ai中肯定不能选的数字有 ( m − 1 ) ∗ ( k − 1 ) (m-1)*(k-1) (m−1)∗(k−1)个,且开头结尾不能选,那么方案数为 ( n − ( m − 1 ) ∗ ( k − 1 ) − 2 m − 2 ) \binom{n-(m-1)*(k-1)-2}{m-2} (m−2n−(m−1)∗(k−1)−2)
由卢卡斯定理 ( n m ) m o d    p = ( n m o d    p m m o d    p ) ∗ ( n / p m / p ) m o d    p \binom{n}{m} \mod p =\binom{n \mod p}{m \mod p} * \binom{n / p}{m / p} \mod p (mn)modp=(mmodpnmodp)∗(m/pn/p)modp
令 p = 2 p=2 p=2: ( n m o d    2 m m o d    2 ) \binom{n \mod 2}{m \mod 2} (mmod2nmod2)只有四种取值,且只有当 ( n m o d    2 ) ≥ ( m m o d    2 ) (n \mod 2) \geq (m \mod 2) (nmod2)≥(mmod2)时有值,而 m o d    2 \mod 2 mod2就相当于取出该数字在二进制下的最后一位,若满足 n n n的每一位都大于等于 m m m的每一位只需满足 n a n d m = m n \ and \ m = m n and m=m即可
code
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &s) {
s = 0;
T w = 1, ch = getchar();
while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
s *= w;
}
int n, m, t, k;
int main() {
read(t);
while (t--) {
read(n), read(m), read(k);
int x = n - (m - 1) * (k - 1) - 2;
int y = m - 2;
if ((x & y) == y) puts("Yes");
else puts("No");
}
return 0;
}