【BZOJ4903】【CTSC2017】吉夫特 [DP]】的更多相关文章

http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇数 所以可以设dp[i][j] 表示前i个数里面,选的最后一个数是第j个数的方案数 转移的时候,枚举前i-1个数选的最后一个数k, 若C(k,i)是奇数,dp[i][j]+=dp[i-1][k] 时间复杂度:O(n^3) #include<cstdio> #include<iostream&…
传送门 可以发现,\(\binom{n}{m}\equiv 1(mod~2)\) 当且仅当 \(m~and~n~=~m\) 即 \(m\) 二进制下为 \(n\) 的子集 那么可以直接写一个 \(3^{18}\) 的枚举子集 \(DP\) 但是还有一个 \(6^9\) 的做法 把数字分成前 \(9\) 位和后 \(9\) 位 设 \(f(s_1,s_2)\) 表示前 \(9\) 位为 \(s_1\),后 \(9\) 位为 \(s_2\) 的超集的答案 那么对于一个数 \(x\),分成 \(x_1…
BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation">nn&m==m" role="presentation">m==mm==m,也就是说n是m的子集,这不就显然了吗 非常友好的枚举子集DP f[i]表示以i结尾的不下降序列的方案数什么的 #include<bits/stdc++.h> us…
吉夫特 Time Limit: 15 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行一个整数n. 接下来n行,每行一个整数,这n行中的第i行,表示ai. Output 一行一个整数表示答案. Sample Input 4 15 7 3 1 Sample Output 11 HINT Main idea 给定一个序列,问有多少个子序列满足相邻的数构成的组合数都为奇数. Solution 首先我们用Lu…
题目描述 给你一个长度为\(n\)的数列\(a\),求有多少个长度\(\geq 2\)的不上升子序列\(a_{b_1},a_{b_2},\ldots,a_{b_k}\)满足 \[ \prod_{i=2}^k\binom{a_{b_{i-1}}}{a_{b_i}}\mod 2>0 \] 答案对\({10}^9+7\)取模. \(n\leq211985,a_i\leq 233333\) \(\forall i\neq j,a_i\neq a_j\) 题解 水题. 先忽略长度\(\geq 2\)这个条…
题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2\neq 0$.答案对 $10^9+7$取模. 输入 第一行一个整数 $n$ . 接下来 $n$ 行,每行一个整数,这 $n$ 行中的第 $i$ 行,表示 $a_i$ . $1\le n\le 211985,1\le a_i\le 233333$ 输出 一行一个整数表示答案. 样例输入 415731…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/problem/300 题解 真 - 签到题. 对于一个组合数,直接进行 Luca 定理. \[ \binom nm = \binom {\frac n2}{\frac m2} \binom {n \bmod 2}{m\bmod 2} \] 可以发现,对于每一个二进制位,如果出现 \((0, 1)\)…
送70分,预处理组合数是否为偶数即可. 剩下的数据,根据Lucas定理的推论可得当且仅当n&m=n的时候,C(n,m)为奇数.这样就可以直接DP了,对于每个数,考虑它对后面的数的影响即可,直接枚举子集即可. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=l; i<=r; i++) using namespace std; ,mod=; int n,ans,a[N],f[N],pos…
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} {\lfloor \frac{n}{2^{i - 1}} \rfloor \mod 2^i \choose \lfloor \frac{m}{2^{i - 1}} \rfloor \mod 2^i} \pmod 2\] 即 \[{n \choose m} = \prod_{each.bit.of.n.…
首先根据lucas, \[ C_n^m\%2=C_{n\%2}^{m\%2}*C_{n/2}^{m/2} \] 让这个式子的结果为计数的情况只有n&m==m,因为m的每一个为1的二进制位都需要n中这一位为1,否则结果就是0 所以枚举子集,设f[i]为以i开头的合法子序列个数,dp的时候枚举子集从后往前dp即可 #include<iostream> #include<cstdio> using namespace std; const int N=300005,mod=1e9…