NOIP模拟四

number

题目描述

现有 \(2^n\) 个点,点编号为 \(0\sim2^n-1\)。

定义这些点的一张异或图为:

先选定一个集合 \(S\)。

对于原图上编号为 \(x\) 和编号为 \(y\) 的点,如果 \(x\oplus y\in S\),那么在 \(x\) 和 \(y\) 之间连一条无向边。

数出有多少个集合 \(S\),满足它的大小尽量小且异或图为连通图。答案对 \(998244353\) 取模。

输入格式

请从 number.in 中读入数据。

输入一行一个数 \(n\)。

输出格式

请将答案输出到 number.out 中。

输出一行,表示答案。

样例

Input 1

1

Output 1

1

Input 2

2

Output 2

3

Input 3

3

Output 3

28

Input 4

189

Output 4

952004352

Input 5

999876

Output 5

936053454

数据范围

【数据范围】

对于所有数据,保证:\(n\le 10^6\)。

测试点编号 \(n \le\)
\(1\sim 3\) \(5\)
\(4 \sim 6\) \(200\)
\(7 \sim 10\) \(10^{6}\)

样例解释

对于第二个样例,集合 \(S\) 的大小最小是 \(2\),\(\{1,2\}\),\(\{1,3\}\),\(\{2,3\}\) 均满足条件。

转换问题:对于一个 \(x\),如果有一个 \(a\in S\),那么 \(x\) 就向 \(x\oplus a\) 连边。


我们发现,集合 \(S\) 中每个数线性无关(即不存在某个数是其余若干个数的异或和)。

证明:如果有一个 \(a\in S\),那么 \(x\) 就向 \(x\oplus a\) 连边。

那么假如又有一个 \(b\in S\),则 \(x\) 会向 \(x\oplus a\) 连边,\(x\oplus a\) 会向 \(x\oplus a\oplus b\) 连边。

这时如果有 \(a\oplus b\in S\),则 \(x\) 会向 \(x\oplus a\oplus b\) 连边,我们会发现这不是必须的,因为此时通过 \(a\) 和 \(b\) 已经让它们连边了,就不需要再有一个 \(a\oplus b\in S\) 了。 可以把 \(a\oplus b\) 删掉。

也就是说,如果一个集合 \(S\) 如果其中某个数是其余若干个数的异或和,则这个集合不是最短的,因为可以把这个数删掉。


我们又发现,集合 \(S\) 最短长度为 \(n\)。

证明:因为集合 \(S\) 中每个数线性无关,所以任选任意个数异或和都不一样,共有 \(2^n\) 种选法,去掉不选即可以组成 \(2^n-1\) 种数。

若对于任意的 \(a\in S\),有 \(a<2^n\),那么集合任选任意个数异或和都小于 \(2^n\),和上面一结合,得出集合 \(S\) 任选任意个数异或和可以组成 \(1\sim2^n-1\) 的数。

也就是以编号为 \(0\) 的节点出发,可以通过 \(S\) 的任意组合链接到 \(1\sim2^n-1\) 的节点。

可以反证当 \(S\) 长度为 \(n-1\) 时无解。


那么我们可以做一个 dp 来求这个方案数。设 \(f_i\) 为决定了集合 \(S\) 前 \(i-1\) 个数,要求第 \(i\) 个数的方案数。第 \(i\) 位可以选 \(2^n\) 种数,因为前面 \(i-1\) 位选过了的若干个异或和不能选,所以去掉 \(2^{i-1}\) 种方案。转移方程为:

\[f_i=f_{i-1}\times(2^n-2^{i-1})
\]

因为集合 \(S\) 无序,所以最后要除以 \(n!\)。

/**
* @file number.cpp
* @tag: #数学
* @author: ZnPdCo
* @date: 2023-12-28 12:54:00
* @problem: https://www.xinyoudui.com/contest?courses=685&books=676&pages=19971&fragments=63901&problemId=19061
**/
#include <cstdio>
#define ll long long
#define N 1000010
#define P 998244353
ll n;
ll ans = 1;
ll qpow(ll x, ll y) {
if(y == 0) return 1;
if(y % 2 == 1) return x * qpow(x, y-1) % P;
ll tmp = qpow(x, y/2);
return tmp * tmp % P;
}
ll npow, xpow = 1, nfact = 1;
int main() {
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
scanf("%lld", &n);
npow = qpow(2, n);
for(ll i = 1; i <= n; i++) {
(ans *= ((npow - xpow)%P+P)%P) %= P;
(xpow *= 2) %= P;
(nfact *= i) %= P;
}
(ans *= qpow(nfact, P-2)) %= P;
printf("%lld", ans);
}

NOIP模拟四的更多相关文章

  1. NOIP 模拟四 考试总结

    #T1随 又是liu_................... 数列n,m个操作,每次随机取a[i],x=x*a[i]%k; 问题是求x期望%mod; 首先考虑到期望转移过程中存在%k,一般套路线性期望 ...

  2. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  3. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  4. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  5. 2017-9-22 NOIP模拟赛[xxy][数论]

    XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场 A Description定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28给出 x,y,求Σf(i),i∈[x ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIp模拟赛二十八

    (这是NOIp模拟赛?应该是NOI模拟赛不小心加了个p) 嗯,假装这是正经的NOIp模拟赛,从今天开始也写写题解吧(这几天被虐的惨惨) 今日情况:8+50+0=58 A题输出样例,B题正解写挂,C题不 ...

  8. 2019.6.20 校内测试 NOIP模拟 Day 1 分析+题解

    这次是zay神仙给我们出的NOIP模拟题,不得不说好难啊QwQ,又倒数了~ T1 大美江湖 这个题是一个简单的模拟题.   ----zay 唯一的坑点就是打怪的时候计算向上取整时,如果用ceil函数一 ...

  9. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  10. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

随机推荐

  1. [VueJsDev] 基础知识 - Node.js常用函数

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html Node.js 常用函数 总结常用 node 函数 用的 E ...

  2. stm32 中断处理函数注意事项

    一 前记 最近在公司的一个项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误--在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致接 ...

  3. 回声消除(Acoustic Echo Cancellation)中遇到的几个常见问题思考

    什么才是好的回声消除效果   个人的理解:好的回声消除算法,要满足两个条件:一个是回声确实被消除了,另外一个是麦克风采集到音频信号不能被消除,常见的就是人的声音信号.这个算法只是提供了一种方法,具体的 ...

  4. dbvisualizer不能执行pl/sql块

    如果是如下语句: begin          dbms_output.put_line('Hello World!'); end; 控制台会报错 解决方案:语句改写为如下 --/ begin    ...

  5. Java基础知识篇02——Java基本语法

    一.数据类型 定义: 就是用了保存数据的一个类型,一种数据类型,只能保存该类型数据值 作用: 只有了解数据类型,才能选择合适的类型存放数据,才能更好的利用计算机硬件资源(内存和硬盘等). 不同的数据类 ...

  6. Java反序列化学习

    前言 早知前路多艰辛,仙尊悔而我不悔.Java反序列化,免费一位,开始品鉴,学了这么久web,还没深入研究Java安全,人生一大罪过.诸君,请看. 序列化与反序列化 简单demo: import ja ...

  7. (1)Python基础的一些教学资料和视频

    Python相关的一些书籍 链接: https://pan.baidu.com/s/1uVT_xQRShxsw2gRhjJhikA 密码: 5fgi Python的相关进阶课程 链接: https:/ ...

  8. Excalidraw:绘制图形的新利器

    摘要: Excalidraw是一款简洁设计.直观易用的绘图应用,用户可以通过它创建流程图.示意图.架构图等各种图形.除了提供手绘效果外,Excalidraw还支持多人实时协作编辑,并提供端到端加密以确 ...

  9. 探寻UUID的起源与奥秘:从时间戳到唯一标识

    1. UUID起源与原理 UUID(Universally Unique Identifier)是一种唯一标识符,最初由Apollo计算机公司的软件工程师Roedy Green在1987年提出.其原理 ...

  10. 如何在windows系统下下载、安装python程序及集成开发环境PyCharm

    1.python下载 python下载官网: https://www.python.org/ http://python.p2hp.com/ 中文网 点击进入官网,进入window下载页面. http ...