题意

有一个定义在 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的更多相关文章

  1. [4.14校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...

  2. [2017.4.7校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...

  3. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  4. 19_04_19校内训练[Game]

    题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...

  5. 19_04_02校内训练[deadline]

    题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...

  6. 平面图转对偶图&19_03_21校内训练 [Everfeel]

    对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...

  7. fzyzojP3979 -- [校内训练20180914]魔法方阵

    原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...

  8. fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试

    题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...

  9. fzyzojP3372 -- [校内训练20171124]博弈问题

    对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...

随机推荐

  1. c# 写个简单的爬虫。注:就一个方法,没有注释,自己猜~哈哈

    和我,在成都的街头走一走,哦~喔~哦~ public JsonResult GetHtml() { string url = "http://www.xxxxxxxxxxxxxxxxxx.c ...

  2. c3p0连接池封装

    在处理数据库事物时需要同一个Connection  但是dbcp无法获得  单独工具也显得繁琐,改进成c3p0工具类: package utils; import java.sql.Connectio ...

  3. struts2中的数据类型自动转换

    参考:https://blog.csdn.net/qq_35326718/article/details/72453042 https://www.cnblogs.com/aigeileshei/p/ ...

  4. DataTable转成实体列表 和 DataRow转成实体类

    #region DataTale转为实体列表 /// <summary> /// DataTale转为实体列表 /// </summary> /// <typeparam ...

  5. react-native-vector-icons 安装、使用

    react-native-vector-icons 安装.使用 前言 任何库的安装与使用都离不开官文,按照官方文档一步步操作可以规避大多数问题.不过很多库只有英文文档,想要完全参透需要时间.react ...

  6. 一款类似loadRunner的优秀国产压力测试工具——kylinTOP测试与监控平台

    市面上流行的压力/负载/性能测试工具多是来自国外,近年来国内的性能测试工具也如雨后春笋般崛起,但大部分产品是基于Jmeter开源内核包装起来的性能测试工具,其中也不乏佼佼者,如:kylinTOP测试与 ...

  7. SQL预处理

    每向数据库发送一条SQL语句,数据库中的SQL解释器就会将SQL语句转换成数据库底层命令,然后执行该命令完成相关的数据库操作.如果频繁的向数据库提交SQL语句,势必会增加数据库中SQL解释器的负担,进 ...

  8. Django 项目目录重构

    原因 一个完整的项目下来, 会涉及很多模块, 文件和资源, 对Django默认的文件目录结构基础上进行重构, 会使得我们的项目结构更加清晰, 便于后期管理 重构 """ ...

  9. 洛谷P1082 同余方程 题解

    题目链接:https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解. 告诉你 \(a,b\) 求 ...

  10. .NET Core 3.1和WorkerServices构建Windows服务

    介绍 ASP.NET Core 3增加了一个非常有意思的功能Worker Service.他是一个ASP.NET Core模板,他允许我们创建托管长期的运行的后台服务,这些服务具体实现IHostedS ...