首页 > 其他分享 >子集卷积 学习笔记

子集卷积 学习笔记

时间:2024-09-06 22:27:04浏览次数:3  
标签:... 卷积 笔记 int 枚举 子集 交集

  • 如果没有交集的情况,就可以做或运算卷积
  • 考虑交集,没有交集=大小和相同
  • 依次考虑集合的大小为0,1,...,n
  • 对每种情况,构造长度为(1<<n)的集合幂级数,只对size=i赋值
  • 枚举答案中集合的大小为0,1,...,n
  • 对每个i,枚举f中的贡献是(j),g中的贡献是(i-j)
  • 让(j)和(i-j)做或运算卷积,答案一定合法
  • 现在的复杂度是O(\(n^2\)n\(2^n\)),利用FWT的正逆变换都是线性的,就能够做到O(\(n^2\)*\(2^n\))
点击查看代码
//子集卷积 
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000009;
int n;
int f[21][(1<<20)],g[21][(1<<20)],a[(1<<20)],b[(1<<20)],h[21][(1<<20)];
int len[(1<<20)];
int lowbit(int n)
{
	return n&(-n);
}
int calc(int x)
{
	int cnt=0;
	while(x)
	{
		x-=lowbit(x);
		cnt++;
	}
	return cnt;
}
void FWTor(int *a,int n,int type)
{
	for(int x=2;x<=n;x<<=1)
	{
		int k=(x>>1);
		for(int i=0;i<n;i+=x)
		{
			for(int j=0;j<k;j++)
			{
				(a[i+j+k]+=(a[i+j]*type))%=mod;
			}
		}
	}
}
void pre()
{
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<(1<<n);j++)
		{
			f[i][j]=(len[j]==i)*a[j];
			g[i][j]=(len[j]==i)*b[j];
		}
		FWTor(f[i],(1<<n),1);
		FWTor(g[i],(1<<n),1);
	}
}
void Or(int k,int l)
{
	for(int i=0;i<(1<<n);i++)
	{
		h[k+l][i]=(h[k+l][i]+1ll*f[k][i]*g[l][i]%mod)%mod;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=0;i<(1<<n);i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<(1<<n);i++)
	{
		cin>>b[i];
	}
	for(int i=0;i<(1<<n);i++)
	{
		len[i]=calc(i);
	}
	/*
	for(int i=0;i<(1<<n);i++)
	{
		int res=1ll*f[0]*g[i]%mod;
		for(int j=i;j;j=(j-1)&i)
		{
			res=(res+1ll*f[j]*g[i-j]%mod)%mod;
		}
		cout<<res<<' ';
	}
	cout<<endl;
	*/
	//枚举子集的做法
	//O(sigma(c(n,i)*2^i))=O(3^n)
	pre();
	for(int i=0;i<=n;i++)
	{
		for(int j=0;i+j<=n;j++)
		{
			Or(i,j);
		}
	}
	for(int i=0;i<=n;i++)
	{
		FWTor(h[i],(1<<n),-1);
	}
	for(int i=0;i<(1<<n);i++)
	{
		cout<<(h[len[i]][i]+mod)%mod<<' ';
	}
	cout<<endl;
	return 0;
}

标签:...,卷积,笔记,int,枚举,子集,交集
From: https://www.cnblogs.com/watersail/p/18401154

相关文章

  • 学习笔记|鹏哥C语言——关键字
    一、 关键字typedeftypedef顾名思义是类型定义,这里应该理解为类型重命名。比如:二、 关键字static在C语言中:static是用来修饰变量和函数的1.修饰局部变量-称为静态局部变量2.修饰全局变量-称为静态全局变量3.修饰函数-称为静态函数三、 修饰局部变量......
  • 回溯——7.子集II
    力扣题目链接给定一个可能包含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入:[1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]解题思路总结:排序:首先对数组进行排序,便于之后的重复元素跳过处理。回溯法:通过递归遍......
  • 软件测试学习笔记丨Pytest的使用
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/221581.简介pytest是一个成熟的全功能python测试框架测试用例的skip和xfail,自动失败重试等处理能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试,接口自动化测试pytest有很多第三方插件,并......
  • Python贝叶斯卷积神经网络BCNN分类胸部X光图像数据集实例
    全文链接:https://tecdat.cn/?p=37604原文出处:拓端数据部落公众号分析师:YuanchunNiu在人工智能的诸多领域中,分类技术扮演着核心角色,其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中,有效的分类算法都是实现智能决策的关键。随着大数据时代的......
  • 【Python学习笔记】第3章 你应如何运行程序
    这一章主要讲:如何启动Python程序、如何交互地输入代码、代码的各种运行方式。交互式命令行模式开始一个交互式会话在终端中,输入python:我们就开启了会话。结束会话按Ctrl+Z:系统路径如果我们要在终端中,输入python就可以启动,那么就需要设置环境变量PATH使其包含安装的python......
  • prometheus学习笔记之其他常用服务自动发现
    一、consul_sd_configsConsulSD配置允许从Consul的CatalogAPI检索抓取目标1.部署Consul 安装参考文档:https://developer.hashicorp.com/consul/install#linux,确认自己的操作系统和安装环境及版本,根据文档下载并安装unzip-qconsul_1.12.2_linux_amd64.zip#由于下载比......
  • Mybatis学习笔记(已完结)
    Mybatis-011.框架​ 框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率。​框架阶段学习:①先去学习如何使用框架②然后再使用熟练的情况下去猜测内部的原理③通过源码去验证自己的猜测。2.Mybatis介绍MyBatis是一款优......
  • STM32学习笔记——GPIO
    GPIO——GeneralPurposeInputOutput——通用输入输出出口特点:通用性、快速翻转、中断支持、支持多种工作模式。8种输入输出模式模式性质特征应用标识浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定适用于需要读取外部信号的场景,但外部信号状态......
  • Python全网最全基础课程笔记(五)——选择结构+Python新特性Match
    本专栏系列为Pythong基础系列,每篇内容非常全面,包含全网各个知识点,非常长,请耐心看完。每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法,其实对......
  • InternLM 大模型实战营笔记-7
    基础岛第5关XTuner微调个人小助手认知目的:用internlm2-chat-1_8b模型,通过QLoRA的方式来微调一个自己的小助手1.微调前的模型对话进行端口映射,XXXXX是自己开发机的端口ssh-CNg-L8501:127.0.0.1:[email protected]激活环境,运行Stream......