题目

题目大意自己看题去……


正解

比赛时在刚第二题,所以根本没有时间思考……

模型可以转化为从\((x_1,x_2,..,x_n)\)出发到\((1,1)\)的方案数模\(2\)。

方案数就用有重复的排列公式:\(\frac{(\sum{x_i})!}{\prod x_i!}\)

考虑它的奇偶性。显然可以将上面的\(2\)因子个数求出来,减去下面的个数,如果为\(0\)则是奇数。

这个东西也就是下面这条式子:\(\sum_{w=2^i} (\lfloor \frac{\sum_{x_i}}{w} \rfloor-\sum{\lfloor \frac{x_i}{w}\rfloor})\)

显然这条式子是大于等于\(0\)的。我们考虑它是否等于\(0\)。

然后我们就发现,如果有相加的时候有进位,那么它就会对下一位有贡献,而这一位的贡献不变。这意味着上式的值至少加\(1\)。

所以,若要它等于\(0\),一定要保证相加的时候没有进位,也就是每一位上为\(1\)的数至多有\(1\)个。

于是就开始DP:设\(f_{i,S}\)表示从高到低到\(i\)位,\(S\)为贴着上限的状态。

由于有上下界的限制,所以容斥一下就可以了。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mo 990804011
#define ll long long
#define N 9
int n;
ll l[N],r[N],lim[N];
ll ans;
ll f[51][512];
inline void upd(ll &a,ll b){a=(a+b)%mo;}
inline ll calc(){
memset(f,0,sizeof f);
f[50][(1<<n)-1]=1;
for (int i=50;i>=1;--i)
for (int j=0;j<1<<n;++j){
if (!f[i][j])
continue;
int s=0;
for (int l=0;l<n;++l)
if (j>>l&1 && !(lim[l]>>i-1&1))
s|=1<<l;
upd(f[i-1][s],f[i][j]);
for (int k=0;k<n;++k)
if (j>>k&1 && lim[k]>>i-1&1 || !(j>>k&1)){
int s_=s&((-1)^1<<k) | ((j>>k&1 && lim[k]>>i-1&1)?1<<k:0);
upd(f[i-1][s_],f[i][j]);
}
}
ll res=0;
for (int i=0;i<1<<n;++i)
res+=f[0][i];
return res%mo;
}
void dfs(int k,int flag){
if (k==n){
ans+=calc()*flag;
return;
}
lim[k]=r[k];
dfs(k+1,flag);
if (l[k]-1>=0){
lim[k]=l[k]-1;
dfs(k+1,-flag);
}
}
int main(){
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
int T;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
for (int i=0;i<n;++i)
scanf("%lld%lld",&l[i],&r[i]),l[i]--,r[i]--;
ans=0;
dfs(0,1);
ans%=mo;
ans=(ans<0?ans+mo:ans);
printf("%lld\n",ans);
}
return 0;
}

总结

坦白说我的脑子真是太不好了……

最新文章

  1. 我的MYSQL学习心得(七) 查询
  2. JVM调优总结 -Xms -Xmx -Xmn -Xss
  3. ASP.NET MVC Web API For APP
  4. IT人学习方法论(一):学习方向
  5. Redhat6.x下如何进行远程安装虚拟机
  6. PLSQL Developer操作
  7. css 权威指南笔记(一)
  8. SQL Server 2008创建定期自动备份任务
  9. String的format方法
  10. Linux命令之必杀绝技Vi文本编辑的使用
  11. python -- 计算数学题--用程序解决问题1
  12. Python3 将configparser从ini文件中读取的内容转换成字典格式
  13. Android查看stdout 和stderr
  14. Windows上安装nvm--nodejs版本管理器
  15. ubuntu和mac OS X下另一种使用QQ的方法
  16. Http接口获取数据写入Hdfs
  17. 【安装vsftpd】安装vsftpd工具步骤
  18. L1-005 考试座位号
  19. 解决win 和 ubuntu 虚拟机之间 无法 复制粘贴的问题,以及重装vmtool后,还是无法解决的办法
  20. Code First 数据库迁移

热门文章

  1. &amp;与&amp;&amp;,|与||的区别
  2. 第五篇 scrapy安装及目录结构,启动spider项目
  3. vue 路由传参中刷新页面参数丢失 及传参的几种方式?
  4. 内网渗透_linux_socks代理_reGeorg+proxychains
  5. EE5111_A0206839W
  6. BBS论坛 后台管理
  7. 标准 IO fprintf 与 sprintf 函数使用
  8. linux部署tomcat项目
  9. linux 下安装mysql5.7.17
  10. jq-demo-在列表中添加新节点,点击删除