jzoj5765 【省选模拟8.5】相互再归的鹅妈妈 (集合划分,斯特林反演)

本文主要是介绍jzoj5765 【省选模拟8.5】相互再归的鹅妈妈 (集合划分,斯特林反演),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述

mk<=5e6m<=5e4 m k <= 5 e 6 , m <= 5 e 4

解法

先考虑可以有相同怎么做:
枚举一个第一个脱离限制的位置,然后用一个脱离限制的数来安排使得异或和为0,其他数可以任意取(要分是否脱离限制确定方案数)。这样可以计算出g(n)表示n个可以相同的数,异或和为0的答案。

斯特林反演式子:
[n=1]=mA    (ai1)!(1)ai1 [ n = 1 ] = ∑ m 的 集 合 划 分 A ∏ ( a i − 1 ) ! ⋅ ( − 1 ) a i − 1

证明非常简单, 右侧是圆周排列加上一个正负1的系数
等式右边也就是

ks(n,k)(1)nk ∑ k s ( n , k ) ⋅ ( − 1 ) n − k
,其中k是所划分的集合个数。
不难得出 s(n)(1)nk s ( n ) ⋅ ( − 1 ) n − k 的生成函数就是 x(x1)(x2)...(xn+1)=xn x ( x − 1 ) ( x − 2 ) . . . ( x − n + 1 ) = x n 下 降
令x=1,那么等式右侧就是 1n=s(n,0)+ 1 n 下 降 = s ( n , 0 ) + 原 式 ,即 =[n=1] 原 式 = [ n = 1 ]
我们要求的就是满足 [ai=1] ∏ [ a i = 1 ] 的 方 案 , 根据这个反演一波即可。

#include <cstdio>
#include <iostream>
#include <cstring>
#define lowbit(x) ((x) & -(x))
using namespace std;
typedef long long ll;const ll mo = 1e9 + 7;
ll n, m, k, len;
char s[50100];
ll a[5000100],suf[5000100],mi[5000100];
ll f[8][2][2],g[8],ans,jc[8],mir[8];
ll q[8],size[8];
void dfs(ll x,ll c) {if (x > n) {memset(size,0,sizeof size);for (ll i = 1; i <= n; i++) size[q[i]]++;ll eve = 0, xs = 1;for (ll i = 1; i <= c; i++) {if (size[i] % 2 == 0) eve++;xs = xs * jc[size[i] - 1] % mo * ((size[i]-1)%2==0?1:-1) % mo;}ll odd = c - eve;(ans += xs * g[odd] % mo * mir[eve]) %= mo;return;}q[x] = c + 1;dfs(x + 1, c + 1);for (ll i = 1; i <= c; i++) {q[x] = i;dfs(x + 1, c);}
}
ll ksm(ll x,ll y) {ll ret = 1;for (; y; y>>=1) {if (y & 1) ret = ret * x % mo;x = x * x % mo;}return ret;
}
int main() {freopen("mothergoose.in","r",stdin);freopen("mothergoose.out","w",stdout);cin>>n>>k;jc[0] = 1;for (ll i = 1; i <= n; i++) jc[i] = jc[i - 1] * i;scanf("%s",s + 1); m = strlen(s + 1);for (ll i = 1; i <= k; i++) for (ll j = 1; j <= m; j++) {a[++len] = s[j] - '0';}ll w = 1; mi[len+1] = 1;for (ll i = len; i; i--, w = w * 2 % mo) {suf[i] = (suf[i+1] + w * a[i]) % mo;mi[i] = w * 2 % mo;}mir[0] = 1;for (ll i = 1; i <= n; i++) mir[i] = mir[i - 1] * suf[1] % mo;ll hasone = 0;for (ll i = 1; i <= len; i++) if (a[i] == 1) {memset(f,0,sizeof f);f[0][0][0] = 1;for (ll j = 1; j <= n; j++) {for (ll z = 0; z < 2; z++) //odd or evenfor (ll e = 0; e < 2; e++) { //has or not(f[j][z^1][e] += f[j-1][z][e] * suf[i+1]) %=mo;(f[j][z][1]   += f[j-1][z][e] * (e == 1 ? mi[i+1] : 1)) %= mo;}if (j%2==0 || !hasone) {(g[j] += f[j][0][1]) %= mo;}}hasone = 1;}g[0] = 1;dfs(1,0); ans = (ans + mo) % mo;cout<<ans * ksm(jc[n], mo - 2) % mo<<endl;
}

这篇关于jzoj5765 【省选模拟8.5】相互再归的鹅妈妈 (集合划分,斯特林反演)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/jokerwyt/article/details/81486964
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/721302

相关文章

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D