jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】
正题
题目大意
定义函数f(x)(xf(x)(xf(x)(x为一个序列)))
若任意一个xi=1x_i=1xi=1那么有f(x)=1f(x)=1f(x)=1
若有一个xi=0x_i=0xi=0那么有f(x)=0f(x)=0f(x)=0
其他的,有f(x)=(∑j=1nf(x1...,xj−1,...xn))%2f(x)=(\sum_{j=1}^nf(x_{1}...,x_j-1,...x_n))\% 2f(x)=(j=1∑nf(x1...,xj−1,...xn))%2
给出li,ril_i,r_ili,ri,求∑li≤xi≤rif(x)\sum_{l_i\leq x_i\leq r_i} f(x)li≤xi≤ri∑f(x)
解题思路
我们发现对于xxx有f(x)=∏i=1n−1C∑xjxif(x)=\prod_{i=1}^{n-1}C_{\sum x_j}^{x_i}f(x)=∏i=1n−1C∑xjxi
然后又有CnkC_{n}^kCnk为奇数仅当(n+k)&k=k(n+k)\&k=k(n+k)&k=k
然后转换为f(x)=1f(x)=1f(x)=1的充要条件就是对于任意的1≤i≠j≤n1\leq i\neq j\leq n1≤i̸=j≤n有(xi+xj)&xi=xi(x_i+x_j)\& x_i=x_i(xi+xj)&xi=xi,证明
然后我们数位dpdpdp,用fi,jf_{i,j}fi,j表示到第iii位时状态jjj中0表示没有到达上界,111表示到达了上界。
对于lil_ili,我们可以对nnn维进行容斥即可。
时间复杂度O(50∗n∗(2n)2)O(50*n*(2^n)^2)O(50∗n∗(2n)2)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=10,XJQ=990804011;
ll T,n,l[N],r[N],x[N],f[60][1<<N],ans,MS;
ll solve(ll S)
{for(ll i=0;i<n;i++){x[i]=((S>>i)&1)?(l[i]-1):r[i];if(x[i]<0) return 0;}memset(f,0,sizeof(f));f[51][0]=1;for(ll i=50;i>=0;i--){for(ll j=0;j<MS;j++){if(!f[i+1][j]) continue;ll now=0;for(ll k=0;k<n;k++)now|=(1<<k)*(x[k]>>i&1);(f[i][j|now]+=(__builtin_popcount(j)+1)*f[i+1][j]+XJQ)%=XJQ;for(ll k=0;k<n;k++)if((now&(~j))>>k&1)(f[i][j|(now^(1<<k))]+=f[i+1][j]+XJQ)%=XJQ;}}ll ans=0;for(ll i=0;i<MS;i++)(ans+=f[0][i]+XJQ)%=XJQ;return ans;
}
int main()
{freopen("c.in","r",stdin);freopen("c.out","w",stdout);scanf("%lld",&T);while(T--){scanf("%lld",&n);MS=1<<n;ans=0;for(ll i=0;i<n;i++)scanf("%lld%lld",&l[i],&r[i]),l[i]--,r[i]--;for(ll i=0;i<MS;i++)(ans+=(__builtin_popcount(i)&1?XJQ-solve(i):solve(i))+XJQ)%=XJQ;printf("%lld\n",ans);}
}
jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】相关推荐
- jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)
题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...
- YbtOJ#20239-[冲刺NOIP2020模拟赛Day10]连边方案【状压dp】
正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/3 题目大意 求有多少个nnn个点mmm条边的无向图满足 有连边的点之间编号差不超过kkk 所有 ...
- 【2022国赛模拟】无损加密——LGV引理、状压DP
原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk 了,暴力也只需要变动 [lk,rk] ...
- 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述] ...
- 【THUWC2019模拟2019.1.18】Counting
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V (V<=100)个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两 ...
- 6009. 【THUWC2019模拟2019.1.18】Counting
题意: 羽月最近发现,她发动能力的过程是这样的: 构建一个 VVV 个点的有向图 GGG,初始为没有任何边,接下来羽月在脑中构建出一个长度为 EEE 的边的序列,序列中元素两两不同,然后羽月将这些边依 ...
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]
题目 题目大意 有个无限长的数列an{a_n}an,a1=1a_1=1a1=1,an=an−1+maxdightk(an−1)a_n=a_{n-1}+maxdight_k(a_{n-1})an= ...
- jzoj6343-[NOIP2019模拟2019.9.7]Medium Counting【记忆化dfs,dp】
正题 题目大意 给出nnn个字符串SiS_iSi,然后有些???号可以进行随便填字母. 然后要求Si<Si+1S_i<S_{i+1}Si<Si+1的情况下求方案数. 解题思路 ...
最新文章
- Linux常用命令汇总(持续更新中)
- 双线程猜数字 TwoThreadGuessNumber.java
- 为什么小程序裂变,最终都变成了利益驱动?
- 数据结构与算法 / 排序算法 / 基本概念
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
- quartus状态机生成_生成器作为(快速失败)状态机
- guice 框架_玩! 框架+ Google Guice
- 背景选择器selector替换按钮默认背景
- ZZULIOJ 1103: 平均学分绩点(函数专题)
- linux内核IDR机制详解【转】
- 数据库设计规范 zhuan
- 【7005】二叉树的遍历问题2
- 谷歌医疗AI商业化提速!Jeff Dean亲自挖来大总管
- Android中解析XML的方法
- Mac最好用的RSS阅读器Reeder使用方法
- 科技文献检索课题 计算机,科技文献检索课题.doc
- java常用工具下载
- python 爬虫 美女_使用Python爬虫爬取网络美女图片
- DeBUG|实例化servlet类xxxx异常
- PHP版三合一收款码_附50多款模板源码
热门文章
- python string length_如何使用python获取字符串长度?哪些方法?
- Linux网络模块全局变量,()不是Linux系统的特色.
- 7-6 区间覆盖 (10 分)(思路+详解)Come 宝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Java使用TCP实现群聊 聊天室(多线程和tcp的使用)
- Java中关于省略作用域报错问题分析
- [JavaWeb-XML]XML_解析_解析方式
- 《C++ Primer》8.1.2节练习
- 2019年第十届蓝桥杯国赛B组试题A-平方序列-枚举
- JAVA中小细节(易忽视和易错点)
- 用python处理excel的基本语法_《使用python3读取处理excel表的数据内容如何对内容求平均值》 用python读取excel文件...