题目

Description

Input

Output

Sample Input
样例输入1:
2 2 998244353
样例输入2:
10 3 998244353

Sample Output
样例输出1:
24
样例输出2:
579443574

Data Constraint

思路

考虑知道点权怎么求

建出trie,对于trie的每个节点,如果它既有0儿子,又有1儿子,那么这两棵子树分别联通后,要找一条最小的边把它们连起来。

于是我们可以枚举这个节点的深度,再枚举它的左子树和右子树的大小,问题转换为:

有x和y个k位二进制数,求它们之间的异或最小值。

设f[x][y][z][u]为有x和y个k位二进制数,最小值≥u的方案数。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=57,M=1<<9;
ll mod;
ll power(ll x,ll t)
{ll b=1;while(t){if(t&1) b=b*x%mod;x=x*x%mod; t>>=1;}return b;
}
int n,m,_2[10];
ll c[M][M],p[N][N][10][M],b[N];
void init(int n)
{for(int i=0; i<=n; i++) {c[i][0]=1;for(int j=1; j<=i; j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}
}
int main()
{freopen("xor.in","r",stdin); freopen("xor.out","w",stdout);scanf("%d%d%d",&n,&m,&mod);init(1<<8);_2[0]=1; for(int i=1; i<=8; i++) _2[i]=_2[i-1]*2;for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) for(int k=0; k<=m; k++) if(!i||!j||!k){ll s=1;for(int w=1; w<=i+j; w++) s=s*_2[k]%mod;for(int w=0; w<_2[k]; w++) p[i][j][k][w]=s;}for(int i=1; i<=n; i++) for(int j=1; j<=n-i; j++) for(int k=1; k<=m; k++) {for(int I=0; I<=i; I++) for(int J=0; J<=j; J++){int t=_2[k-1];if((I&&J)||((i-I)&&(j-J))) t=0;ll yjy=c[i][I]*c[j][J]%mod;for(int w=0; w<_2[k-1]; w++){if(t==0) p[i][j][k][w+t]=(p[i][j][k][w+t]+p[I][J][k-1][w]*p[i-I][j-J][k-1][w]%mod*yjy)%mod;else p[i][j][k][w+t]=(p[i][j][k][w+t]+p[I][j-J][k-1][w]*p[i-I][J][k-1][w]%mod*yjy)%mod;}}ll s=p[i][j][k][_2[k-1]];for(int w=0; w<_2[k-1]; w++) p[i][j][k][w]=(p[i][j][k][w]+s)%mod;}ll ans=0;for(int i=1; i<=m; i++) {b[0]=1;b[1]=_2[m]-_2[i];for(int j=2; j<=n; j++) b[j]=b[j-1]*b[1]%mod;for(int j=1; j<=n; j++) for(int k=1; k<=n-j; k++){ll yjy=c[n][j]*c[n-j][k]%mod*_2[m-i]%mod*b[n-j-k]%mod;ll yjy2=1;for(int w=1; w<=j+k; w++) yjy2=yjy2*_2[i-1]%mod;ans=(ans+yjy*_2[i-1]%mod*yjy2)%mod;ll s=0;for(int w=1; w<_2[i-1]; w++) s=(s+p[j][k][i-1][w])%mod;ans=(ans+yjy*s)%mod;}}printf("%lld\n",ans);
}

【JZOJ 省选模拟】6707.异或树(xor)相关推荐

  1. 6687. 【JZOJ 省选模拟】树没了(tree)

    题目 Description Input Output 2操作的个数行,每行代表一个询问的答案. Sample Input 5 5 1 1 2 3 4 5 1 2 2 3 2 4 1 5 Q 1 M ...

  2. 【JZOJ 省选模拟】向日葵人生

    Description Input Output Sample Input 样例 1 输入: 2 3 2 1 2 2 3 Sample Output 样例 1 输出: 665496241 Data C ...

  3. 【JZOJ 省选模拟】感受清风

    题目 Description Input Output 对于每个 qu 事件或者 qd 事件输出一个整数表示答案,答案对1000001取模(提示:这个数不 是质数,有101×9901=1000001) ...

  4. 【JZOJ 省选模拟】鱼池逃脱Cow at Large

    题目 Description 胖头鱼从鱼戏团逃脱后,被主人一路追捕,他慌不择路地跑进了一颗n个节点的池子树,池子树的所有度数为1的点就是出口. 假如他现在在节点i,那么每个时刻他能选择向某个与当前点有 ...

  5. 【JZOJ 省选模拟】多项式(poly)

    题目 Description Input Output Sample Input 样例输入 1: 2 7 -7 14 样例输入 2: 3 1 4 1 5 样例输入 3: 0 998244353 Sam ...

  6. 【JZOJ 省选模拟】铺路 (road )

    题目 Description Input Output Sample Input 样例输入 1: 4 4 1 3 4 2 4 8 1 2 2 3 4 3 样例输入 2: 3 2 1 2 3 2 3 4 ...

  7. 【JZOJ 省选模拟】我的朋友们

    题目 Description Input Output 一行一个整数,表示题目描述中的期望对998244353取模的值. Sample Input 样例 1输入: 4 3 1 5 4 6 3 7 1 ...

  8. 【JZOJ 省选模拟】6681.图

    题目 Description 给定一张无重边.自环.割点的平面图,你需要回答 Q 次询问,每次询问会给出一个简单环,你需要回答在由这个简单环围成的多边形内部(包括边界上)的点有多少个. 保证图中每条线 ...

  9. 【JZOJ 省选模拟】人生(life)

    题目 Description Input 第一行一个正整数n. 第二行n个整数,其中第i个整数为1表示点i的颜色为黑色,为0表示点i的颜色为白色,为-1 则不确定. Output 输出一行一个整数表示 ...

最新文章

  1. 论文:贝叶斯优化算法和应用综述(2)--概率模型和采集函数的介绍以及综述列表
  2. C#线程、前后台线程
  3. 【codeforces 796A】Buying A House
  4. c++中计算2得n次方_七上,一元一次方程,知识点综合学霸笔记在手
  5. Selenium alert 弹窗处理
  6. Putty工具包简单使用
  7. 矩阵运算_迹的相关性质
  8. MacPorts 命令集合
  9. POI导出Excel设置自适应列宽
  10. kylin安装以及遇见到的一些问题和解决方法
  11. 【hihocoder 1477】闰秒
  12. 苹果手机升级13无法开机_苹果手机更新时突然断电,手机无法开机,为什么?...
  13. HTML5 UI 模板
  14. matlab示波器横轴变纵轴,excel表格横轴数据变纵轴-在EXCEL中做图表,横坐标和纵坐标如何调换?...
  15. 必考题系列--十种常见的运行时异常
  16. 云笔记有什么功能作用,浏览器如何添加云笔记插件
  17. 开创云端时空智能,千寻位置加速三维实景中国建设
  18. tkinter模块常用控件及描述
  19. 近源渗透测试之Keylogger实战
  20. Linux线程互斥学习笔记--详细分析

热门文章

  1. postgresql建表带注释_PostgreSQL 创建新表
  2. 后台系统右边内容如何出现滚动条和解决双滚动条的问题
  3. java程序设计及应用开发_Java程序设计及应用开发
  4. # 切削加工形貌的相关论文阅读【1】-球头铣刀铣削球面的表面形貌建模与仿真研究
  5. passwd命令及其修改过程
  6. 1.1.初识JAVA
  7. Generalized Category Discovery(论文翻译)
  8. php生成excel完整实例代码,php生成excel列序号代码实例
  9. 2009年全国数模比赛,江苏一等奖名单
  10. 大话西游经典台词2-重温经典