[校内训练19_09_03]c Huge Counting
题意
有一个定义在 k 维非负整点上的函数:$f(x_1,x_2,...,x_k):N_{0}^{k}->\{0,1\}$ ,定义方法如下:
若存在$j∈[1,k],x_j=0$,则$f(x_1,x_2,...,x_k)=0$
若对$j∈[1,k]$都有$x_j=1$则$f(x_1,x_2,...,x_k)=1$
否则$f(x_1,x_2,...,x_k)=(\sum_{j=1}^{k}{f(x_1,...,x_{j-1},x_j-1,x_{j+1},...,x_k)})mod 2$
现在给出k,并对每一维坐标给出区间$l_i,r_i$,求:
$\sum_{x_1∈[l_1,r_1],...,x_k∈[l_k,r_k]}{f(x_1,x_2,...,x_k)}$
$1\leq T \leq 10,1 \leq k \leq 9,1 \leq l_j,r_j \leq 10^{15}$。
思考
对于k,某个点的f值为1的充要条件是所有维度在二进制表示下没有交集,即$x_i\&x_j=0,i≠j$。
由于每个维度都有一个限制,不好算,因此我们容斥每个维度是否满足限制。这样,问题转化为选k个数,第i个数最多能选$a_i$个,每一个二进制位上最多有一个1的方案数。设f[i][0/1][S]表示从高位到低位填到第i个数,0/1是当前有没有选1,S是k个数是否达到上限的方案数。每次转移时,考虑当前这一位填不填1即可。
复杂度$O(T*2^{(2k)}*n)$,需要卡常。
代码
- // luogu-judger-enable-o2
- #define mod 990804011
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long int ll;
- int T;
- int k;
- ll ans,L[],R[];
- ll f[][][<<];
- bool vis[<<][<<];
- int BASE,dig[];
- int d[];
- struct node
- {
- int S1,S2;
- ll val;
- node(int a=,int b=,ll c=):S1(a),S2(b),val(c){}
- };
- inline ll get(ll S,ll x)
- {
- return (S&((ll)(ll)<<x))>;
- }
- inline ll newlimit(ll D,ll nowD,ll limit)
- {
- return ((D^nowD)^(BASE))&limit;
- }
- inline ll max(ll x,ll y)
- {
- return x>y?x:y;
- }
- inline ll calc(int S)
- {
- ll maxx=;
- for(int i=;i<=;++i)
- dig[i]=;
- for(int i=;i<k;++i)
- {
- if(S&((ll)<<i))
- {
- if(L[i]==)
- return ;
- for(int j=;j<=;++j)
- dig[j]|=get(L[i]-,j)<<i;
- maxx=max(maxx,L[i]);
- }
- else
- {
- for(int j=;j<=;++j)
- dig[j]|=get(R[i],j)<<i;
- maxx=max(maxx,R[i]);
- }
- }
- int base=log2(maxx)+;
- memset(f,,sizeof(f));
- f[base][][(<<k)-]=;
- for(register int i=base;i>=;--i)
- {
- for(register int S=;S<(<<k);++S)
- if(f[i][][S])
- {
- register int x=newlimit(dig[i-],,S);
- f[i-][][x]=(f[i-][][x]+f[i][][S])%mod;
- }
- for(register int S=;S<(<<k);++S)
- if(f[i][][S])
- {
- register int x=newlimit(dig[i-],,S);
- f[i-][][x]=(f[i-][][x]+f[i][][S])%mod;
- }
- for(register int S=;S<(<<k);++S)
- if(f[i][][S])
- for(register int d1=;d1<k;++d1)
- if(get(S,d1)==||get(dig[i-],d1)==)
- {
- register int x=newlimit(dig[i-],<<d1,S);
- f[i-][][x]=(f[i-][][x]+f[i][][S])%mod;
- }
- for(register int S=;S<(<<k);++S)
- if(f[i][][S])
- for(register int d=;d<k;++d)
- if(get(S,d)==||get(dig[i-],d)==)
- {
- register int x=newlimit(dig[i-],<<d,S);
- f[i-][][x]=(f[i-][][x]+f[i][][S])%mod;
- }
- }
- ll sum=;
- for(register int S=;S<(<<k);++S)
- sum=(sum+f[][][S]+f[][][S])%mod;
- return sum;
- }
- void dfs(int s,int S,int G)
- {
- if(s==k)
- {
- ll x=calc(S);
- if(G&)
- ans=(ans-x+mod)%mod;
- else
- ans=(ans+x)%mod;
- return;
- }
- dfs(s+,S,G);
- dfs(s+,S|((ll)<<s),G+);
- }
- inline void solve()
- {
- cin>>k;
- for(int i=;i<k;++i)
- {
- cin>>L[i]>>R[i];
- --L[i],--R[i];
- }
- ans=;
- BASE=((ll)<<k)-;
- dfs(,,);
- cout<<ans<<endl;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin>>T;
- while(T--)
- solve();
- return ;
- }
[校内训练19_09_03]c Huge Counting的更多相关文章
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 19_04_19校内训练[Game]
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- fzyzojP3979 -- [校内训练20180914]魔法方阵
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...
- fzyzojP3372 -- [校内训练20171124]博弈问题
对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...
随机推荐
- 24.configparser&hashlib
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html configparser 来看一个好多软件的常见文档格式如下: [DEFAULT] ...
- Apache Derby-01介绍DERBY
1.DERBY是什么: Apache Derby 是IBM于2004年贡献给Apache软件基金会的数据库,于2005年正式成为开源项目,Derby作为一个基于JAVA的关系型数据库框架,他拥有许多便 ...
- 换根DP(二次扫描)
参考来自这里: https://blog.csdn.net/qq_41286356/article/details/94554729 题目在这里 https://ac.nowcoder.com/acm ...
- 使用poi读写excel、向excel追加数据等,包括.xls和.xlsx文档
1.使用maven引入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>p ...
- VC/c++版本获取现行时间戳精确到毫秒
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数.通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完 ...
- libcurl库的简单使用
#include <stdio.h> #include <tchar.h> #include <windows.h> #include <process.h& ...
- Linux三剑客之sed的基本用法介绍
[介绍] sed是一款强大的非交互式的文本编辑器,可以对文件文本进行增删改查的相关操作,本文主要是讲解以下sed的基本用法. [常用选项] -e 下一个参数为一个sed指令,一般只会用于同一行有多个s ...
- “Deep models under the GAN: information leakage from collaborative deep learning”阅读笔记
一.摘要 指出深度学习在机器学习场景下的优势,以及深度学习快速崛起的原因.随后点出研究者对于深度学习隐私问题的考虑.作者提出了一种强力的攻击方法,在其攻击下任何分布式.联邦式.或者中心化的深度学习方法 ...
- linux tomcat安装
一.下载tomcat包 下载tomcat包并上传至服务器中 解压文件: tar -zxvf apache-tomcat-8.5.47.tar.gz 为了后期程序的便于管理,我们还需要将Tomcat复制 ...
- EF 学习系列三 数据操作数据加载及EF中执行Sql
1.实体状态 我们通过EF来对数据库进行操作并持久化到数据库,那么EF必然通过EF上下文来维护实体的状态,明确知道每一个状态所对应的操作.也就是说EF通过上下文负责跟踪实体的状态.EF实体状态存在命名 ...