loj#6072 苹果树(折半搜索,矩阵树定理,容斥)

loj

题解时间

$ n \le 40 $ 。

无比精确的数字。

很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了。

折半搜索排序来统计有i个果子是有用的情况下的方案数。

然后矩阵树求生成树个数,容斥乱搞。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<typename TP>inline void read(TP &tar)
  4. {
  5. TP ret=0,f=1;char ch=getchar();
  6. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
  8. tar=ret*f;
  9. }
  10. namespace RKK
  11. {
  12. const int N=50,mo=1000000007;
  13. void doadd(int &a,int b){if((a+=b)>=mo)a-=mo;}
  14. int add(int a,int b){return (a+=b)>=mo?a-mo:a;}
  15. int fpow(int a,int p){int ret=1;while(p){if(p&1)ret=1ll*ret*a%mo;a=1ll*a*a%mo,p>>=1;}return ret;}
  16. struct pat{int x,y;bool operator < (const pat &p)const{return x<p.x;}};
  17. int n,halfn,lim,val[N],msn;
  18. pat l1[1145141];int tp1;
  19. pat l2[1145141];int tp2;
  20. void dfs1(int x=1,int sum=0,int cnt=0)
  21. {
  22. if(sum>lim) return;if(x>halfn){l1[++tp1]=(pat){sum,cnt};return;}
  23. dfs1(x+1,sum,cnt);if(~val[x]) dfs1(x+1,sum+val[x],cnt+1);
  24. }
  25. void dfs2(int x=halfn+1,int sum=0,int cnt=0)
  26. {
  27. if(sum>lim) return;if(x>n){l2[++tp2]=(pat){sum,cnt};return;}
  28. dfs2(x+1,sum,cnt);if(~val[x]) dfs2(x+1,sum+val[x],cnt+1);
  29. }
  30. int c[N][N];void init(){for(int i=0;i<=40;i++){c[i][0]=1;for(int j=1;j<=i;j++)c[i][j]=add(c[i-1][j-1],c[i-1][j]);}}
  31. int ma[N][N];
  32. int calc(int sn)
  33. {
  34. memset(ma,0,sizeof(ma));
  35. for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)
  36. {
  37. if((i<=sn&&(j<=sn||j>msn))||i>msn||j>msn)
  38. ma[i][i]++,ma[j][j]++,doadd(ma[i][j],mo-1),doadd(ma[j][i],mo-1);
  39. }
  40. int b=n-1;int f=1;
  41. for(int l=1;l<=b;l++)
  42. {
  43. int g=l;for(;g<=b&&!ma[g][l];g++);if(g>b) return 0;
  44. if(g!=l){for(int j=l;j<=b;j++) swap(ma[l][j],ma[g][j]);f=-f;}
  45. for(g=l+1;g<=b;g++)
  46. {
  47. int k=1ll*ma[g][l]*fpow(ma[l][l],mo-2)%mo;
  48. for(int j=l;j<=b;j++) doadd(ma[g][j],mo-1ll*ma[l][j]*k%mo);
  49. }
  50. }
  51. if(f==-1) f=mo-1;
  52. for(int i=1;i<=b;i++) f=1ll*f*ma[i][i]%mo;
  53. return f;
  54. }
  55. int cnt[N],sum[N];
  56. int cnttmp[N];
  57. int main()
  58. {
  59. read(n),read(lim),halfn=n+1>>1;
  60. for(int i=1;i<=n;i++) read(val[i]),msn+=(val[i]!=-1);
  61. dfs1(),dfs2();init();
  62. sort(l1+1,l1+tp1+1),sort(l2+1,l2+tp2+1);
  63. for(int i1=tp1,i2=1;i1;i1--)
  64. {
  65. for(;i2<=tp2&&l1[i1].x+l2[i2].x<=lim;cnttmp[l2[i2].y]++,i2++);
  66. for(int j=0;j<=n;j++) doadd(cnt[l1[i1].y+j],cnttmp[j]);
  67. }
  68. for(int i=0;i<=msn;i++) sum[i]=calc(i);
  69. for(int i=1;i<=msn;i++)for(int j=0;j<i;j++)
  70. doadd(sum[i],mo-1ll*c[i][j]*sum[j]%mo);
  71. int ans=0;
  72. for(int i=0;i<=msn;i++) doadd(ans,1ll*cnt[i]*sum[i]%mo);
  73. printf("%d\n",ans);
  74. return 0;
  75. }
  76. }
  77. int main(){return RKK::main();}

loj#6072 苹果树(折半搜索,矩阵树定理,容斥)的更多相关文章

  1. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  2. 【bzoj4596】[Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥)

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等 ...

  3. [SHOI2016] 黑暗前的幻想乡 - 矩阵树定理,容斥

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 20; const in ...

  4. 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理

    题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...

  5. 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)

    [LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...

  6. LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)

    题面传送门 一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到? 首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部 ...

  7. [专题总结]矩阵树定理Matrix_Tree及题目&题解

    专题做完了还是要说两句留下什么东西的. 矩阵树定理通俗点讲就是: 建立矩阵A[i][j]=edge(i,j),(i!=j).即矩阵这一项的系数是两点间直接相连的边数. 而A[i][i]=deg(i). ...

  8. 4.9 省选模拟赛 生成树求和 变元矩阵树定理 生成函数 iDFT 插值法

    有同学在loj上找到了加强版 所以这道题是可以交的.LINK:生成树求和 加强版 对于30分 爆搜 可实际上我爆搜只过了25分 有同学使用按秩合并并茶几的及时剪枝通过了30分. const int M ...

  9. loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)

    loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积) loj 题解时间 首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数. 然后考虑矩阵 ...

随机推荐

  1. MXNet学习:试用卷积-训练CIFAR-10数据集

    第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...

  2. Solution -「CCO 2019」「洛谷 P5532」Sirtet

    \(\mathcal{Description}\)   Link.   在一个 \(n\times m\) 的网格图中,每个格子上是空白 . 或沙子 #,四联通的沙子会连成一个整体.令此时所有沙子块同 ...

  3. Spring5基础

    基于Spring 5.2.6 版本. Spring概念 IOC容器 IOC底层原理的演进过程--本质就是为了高内聚,低耦合 在原始方式中,我们通过new创建对象来实现创建对象的逻辑,但是这样做当对象路 ...

  4. MTK sensor 架构

    mtk architactureAP和scp 两部分组成从上到下的整体的结构是 app -->framerwork-->native-->hal -->kernel --> ...

  5. vue3-hash-calendar,一款基于vue3.x开发的移动端日期时间选择组件

    在大家的催更下,鸽了一天又一天,vue3-hash-calendar 终于在今天诞生了. 按照惯例,先上效果图 Demo 扫描上方二维码或者请用浏览器的手机模式查看:https://www.hxkj. ...

  6. [题解]RQNOJ PID87 过河

    链接:http://www.rqnoj.cn/problem/87 思路:动态规划 定义f[i][j]表示到达第 i 块给定石头用了 j 块添加石头的最少步数. 转移方程:f[i][j]=min{f[ ...

  7. Oracle之单行函数(字符串函数/数字函数/转换函数/日期函数/通用函数)

    虚拟表DUAL介绍: dual是一张虚拟表,只有一行一列,用来构成select的语法规则. Oracle的查询中,必须使用"select 列- from 表"的完整语法,当查询单行 ...

  8. vmware启动报错:Failed to load SELinux policy. Freezing

    修改 : SELINUX=disabled     正确 误修改: SELINUXTYPE=disabled   错误 导致无法开机 错误结果 重启后 机器就报 Failed to load SELi ...

  9. Qt:QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联

    0.说明 QJsonDocument类提供了read/write JSON文档的方法. 用QJsonDocument::fromJson()方法,可以从将一个JSON文件(或者QByteArray数据 ...

  10. Pycharm:使用Edit Custom VM Options导致Pycharm无法启动

    解决办法: Edit Custom VM Options用来扩大内存,但是内存设置不当可能会导致Pycharm无法启动 如果无法启动,可以在我的文档中的pycharm201X.X(日期不同名字也不同) ...