P3773 [CTSC2017]吉夫特
看到组合数在模 $2$ 意义下的乘积,考虑用 $lucas$ 定理把组合数拆开
$lucas$ 告诉我们,$C(n,m)$ 在模 $k$ 意义下的值,相当于 $n,m$ 在 $k$ 进制下每一位的组合数分别相乘的积在模 $k$ 意义下的值
就是若 $n=\sum_{i=0}a[i]k^i$,$m=\sum_{i=0}b[i]k^i$,其中 $a[i],b[i] \in [0,k-1]$ ,那么 $C(n,m) \equiv \prod_{i=0}C(a[i],b[i])\ \ (mod\ k)$
所以考虑把每一个组合数二进制拆分,变成一堆 $C(0,0)C(1,0)C(0,1)$ 相乘的形式
发现若要保证结果为奇数,则一定不能出现 $C(0,1)$ ,不然结果就等于 $0$
所以组合数为奇数当且仅当对于 $n$ 在二进制下的每一位,若为 $1$ 则 $m$ 在二进制下此位为 $0,1$ 都行,若为 $0$ 则 $m$ 在二进制下此为必须为 $0$
其实就是,若 $C(n,m)mod\ 2=1$ 当且仅当 $n \& m=m$ ,其中 '&' 表示按位与
要求 $\prod _{i=2}^{k}\binom{a_{b_{i-1}}}{a_{b_i}} mod\ 2>0$ 其实就是对于每一个 $i \in [2,k]$,都有 $a_{b_{i-1}} \& a_{b_i}=a_{b_i}$
直接设 $f[i]$ 表示从后往前考虑到第 $i$ 位,满足要求的子序列数量
转移直接枚举子集暴力转移就好了,注意最后答案要减去子序列长度为 $1$ 的情况
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef long double ldb;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e6+,mo=1e9+;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int n,a[N],pos[N],f[N],ans;
int main()
{
n=read();
for(int i=;i<=n;i++) a[i]=read(),pos[a[i]]=i;
for(int i=n;i;i--)
{
f[i]=;
for(int j=(a[i]-)&a[i];j;j=(j-)&a[i])
f[i]=fk(f[i]+f[pos[j]]);
ans=fk(ans+f[i]);
}
printf("%d\n",fk(ans-n+mo));
return ;
}
P3773 [CTSC2017]吉夫特的更多相关文章
- 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...
- luogu P3773 [CTSC2017]吉夫特
luogu 这里的组合数显然要用\(\text{lucas}\)定理来求,所以考虑\(\text{lucas}\)定理的本质,即把\(n,m\)分别拆分成\(p\)进制串\(\{a\}\{b\}\), ...
- BZOJ4903 UOJ300 CTSC2017 吉夫特 【Lucas定理】
BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation&q ...
- [CTSC2017]吉夫特
Description: 给定一个序列\(a_1,a_2,a_3...a_n\) 求有多少个不上升子序列: \(a_{b1},a_{b_2}...\) 满足 \(C_{a_{b1}}^{a_{b2}} ...
- BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
题目链接 首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\). 简要证明: 因为是\(mod\ 2\),考虑Lucas定理. 在\(mod\ 2\)的情况下\(C(n,m)\)最后只会 ...
- uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b ...
- bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特
http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇 ...
- [UOJ300][CTSC2017]吉夫特
uoj bzoj luogu sol 根据\(Lucas\)定理,\(\binom nm \mod 2=\binom{n\%2}{m\%2}\times\binom{n/2}{m/2}\mod 2\) ...
- BZOJ4903: [Ctsc2017]吉夫特
传送门 可以发现,\(\binom{n}{m}\equiv 1(mod~2)\) 当且仅当 \(m~and~n~=~m\) 即 \(m\) 二进制下为 \(n\) 的子集 那么可以直接写一个 \(3^ ...
随机推荐
- linux--mongodb安装与配置
linux下的mongodb的安装: 在mongodb的官网上下载:mongodb-linux-x86_64-rhel62-3.2.3.gz1.解压: tar -xvf mongodb-linux-x ...
- 23飞机大战__pygame 快速入门
1. 使用 pygame 创建图形窗口 小节目标 游戏的初始化和退出 理解游戏中的坐标系 创建游戏主窗口 简单的游戏循环 可以将图片素材 绘制 到 游戏的窗口 上, 开发游戏之前需要先知道 如何建 ...
- 【LeetCode】数学(共106题)
[2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...
- Codeforces Round #585 (Div. 2) [补题]
前言 2019.9.16 昨天下午就看了看D题,没有写对,因为要补作业,快点下机了,这周争取把题补完. 2019.9.17 这篇文章或者其他文章难免有错别字不被察觉,请读者还是要根据意思来读,不要纠结 ...
- JS基础入门篇( 三 )—使用JS获取页面中某个元素的4种方法以及之间的差别( 一 )
1.使用JS获取页面中某个元素的4种方法 1.通过id名获取元素 document.getElementById("id名"); 2.通过class名获取元素 document.g ...
- flask之环境的搭建
一.查看ubantu上是否安装虚拟环境的包 virtualenv --version 这里显示的是:15.0.1的版本,如果没有的话, sudo pip install virtualenv sudo ...
- springboot+thymeleaf 访问静态资源解决(static)
---------------------------------------2.1.3-------------------------------------------------------- ...
- php array_slice()函数 语法
php array_slice()函数 语法 作用:在数组中根据条件取出一段值,并返回.大理石平台支架 语法:array_slice(array,start,length,preserve) 参数: ...
- Jenkins slave-agent.jnlp 无法安装为服务(install as a service)
问题: 在部署持续集成环境,配置slave节点时遇到一个问题,slave-agent.jnlp可以正常启动运行(不能正常启动的点这里) 但是在保存为系统服务时,slave-agent.jnlp点击[i ...
- Bing Advanced Search Tricks You Should Know
Bing is one of the world's most popular search engines that has gained many fans with its ease of us ...