[HDU6057]Kanade’s convolution

2024-03-16 23:32
文章标签 convolution kanade hdu6057

本文主要是介绍[HDU6057]Kanade’s convolution,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Kanade's convolution

题解

我们要求的式子是c_{k}=\sum_{i \& j=k}a_{i \oplus j}\cdot b_{i | j}

长得极其丑陋。。。

于是我们考虑将其变形一下,令x=i|j \, , \, y=i\oplus j,于是条件i\& j= k\Rightarrow x-y= k。因为y有的1的位置x肯定都有,所以x-y=k\Rightarrow x\oplus y= k。由于可以构成这样的(x,y)数对的(i,j)数对总共有2^{bit_{n}}个,我们需要在加时乘上一个2^{bit_{n}}。并且加上满足条件[x\& y=y]

于是原式就成了

c_{k}= \sum_{x\oplus y=k} [x\&y=y]2^{bit_{y}}a_{x}b_{y}。看起来好像FWT呀,可是这个条件该怎么做呢?

我们发现由于x,y它们之间的关系并且x\oplus y = k,故[x\&y=y]\Rightarrow bit_{x}-bit_{y}=bit_{k}。而bit_{x}bit_{y}又可以代表它里面1的个数,我们便想到先把2^{bit_{y}}加到a_{x}中,再用FMT的形式来表示它,设a_{bit_{i}}=\left \{ a_{bit{i},i},...\right \},就成了

C_{k}=\sum_{i=k}^{n}A_{i}B_{i-k}。于是,就可以用FMT将其卷积后乘出来再卷回去就行了。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<bitset>
#include<set>
using namespace std;
#define MAXN 2000005
typedef long long LL;
typedef pair<int,int> pii;
const LL mo=998244353;
const LL inv2=mo+1LL>>1LL;
#define gc() getchar()
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=gc();while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}x*=f;
}
template<typename _T>
void read2(_T &x){_T f=1;x=0;char s=gc();while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}while(s>='0'&&s<='9'){x=(x<<1)+(s^48);s=gc();}x*=f;
}
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
LL n,lim,a[MAXN],b[MAXN],now,Ans,bit[MAXN];
LL f[22][MAXN],g[22][MAXN],ans[22][MAXN];
void FMT(LL *f,LL opt=1LL){for(int k=1;k<lim;k<<=1)for(int i=0;i<lim;i+=(k<<1))for(int j=0;j<k;j++){LL x=f[i+j],y=f[i+j+k];f[i+j]=(x+y)%mo*opt%mo;f[i+j+k]=(x-y+mo)%mo*opt%mo;}
}
void mul(LL *A,LL *F,LL *G){for(int i=0;i<lim;i++)A[i]=(A[i]+F[i]*G[i]%mo)%mo;}
signed main(){read(n);lim=1<<n;for(int i=0;i<lim;i++)read(a[i]),bit[i]=bit[i>>1]+(i&1);for(int i=0;i<lim;i++)read(b[i]);for(int i=0;i<lim;i++)f[bit[i]][i]=a[i]*(1LL<<bit[i])%mo;for(int i=0;i<lim;i++)g[bit[i]][i]=b[i];for(int i=0;i<=n;i++)FMT(f[i]),FMT(g[i]);for(int i=0;i<=n;i++)for(int j=0;j+i<=n;j++)mul(ans[i],f[j],g[i+j]);	for(int i=0;i<=n;i++)FMT(ans[i],inv2);now=1;for(int i=0;i<lim;i++)Ans=(Ans+ans[bit[i]][i]*now)%mo,now=now*1526LL%mo;printf("%lld\n",Ans);return 0;
}
/**/

谢谢!!!

这篇关于[HDU6057]Kanade’s convolution的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817095

相关文章

【tensorflow 使用错误】tensorflow2.0 过程中出现 Error : Failed to get convolution algorithm

如果在使用 tensorflow 过程中出现 Error : Failed to get convolution algorithm ,这是因为显卡内存被耗尽了。 解决办法: 在代码的开头加入如下两句,动态分配显存 physical_device = tf.config.experimental.list_physical_devices("GPU")tf.config.experiment

[深度学习]转置卷积(Transposed Convolution)

一.写在前面 在GAN(Generative Adversarial Nets, 直译为生成式对抗网络)中,生成器G利用随机噪声Z,生成数据。那么,在DCGAN中,这部分是如何实现呢?这里就利用到了Transposed Convolution(直译为转置卷积),也称为Fractional Strided Convolution。那么,接下来,从初学者的角度,用最简单的方式介绍什么是转置卷积,以及

python 实现convolution neural network卷积神经网络算法

convolution neural network卷积神经网络算法介绍 卷积神经网络(Convolutional Neural Networks, CNN)是一种包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks, FNN),是深度学习的代表算法之一。以下是关于卷积神经网络算法的详细解释: 基本原理 CNN的核心思想是通过模拟人类视觉系统的工作

每日Attention学习16——Multi-layer Multi-scale Dilated Convolution

模块出处 [CBM 22] [link] [code] Do You Need Sharpened Details? Asking MMDC-Net: Multi-layer Multi-scale Dilated Convolution Network For Retinal Vessel Segmentation 模块名称 Multi-layer Multi-scale Dilate

一文彻底搞懂CNN - 卷积和池化(Convolution And Pooling)

Convolutional Neural Network CNN(卷积神经网络)最核心的两大操作就是卷积(Convolution)和池化(Pooling)。卷积用于特征提取,通过卷积核在输入数据上滑动计算加权和;池化用于特征降维,通过聚合统计池化窗口内的元素来减少数据空间大小。 Convolution And Pooling 一、_卷积(Convolution) 卷积(Convol

【OpenCV】 中使用 Lucas-Kanade 光流进行对象跟踪和路径映射

文章目录 一、说明二、什么是Lucas-Kanade 方法三、Lucas-Kanade 原理四、代码实现4.1 第 1 步:用户在第一帧绘制一个矩形4.2 第 2 步:从图像中提取关键点4.3 第 3 步:跟踪每一帧的关键点 一、说明 本文针对基于光流法的目标追踪进行叙述,首先介绍Lucas-Kanade 方法的引进,以及基本推导,然后演示如何实现光流法的运动跟踪。并以Open

改进YOLO系列 | Microsoft 团队 | Dynamic Convolution :自适应地调整卷积参数

改进YOLO系列:Microsoft团队的Dynamic Convolution——自适应调整卷积参数的计算机视觉方法(中文综述) 简介 YOLO(You Only Look Once)是一种目标检测算法,以其速度和精度著称。 本文将介绍YOLO系列的改进,包括Microsoft团队提出的Dynamic Convolution(动态卷积)。Dynamic Convolution通过自适应调整卷

convolution backbone network——GCNet

GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond paper: https://arxiv.org/pdf/1904.11492.pdf github: https://github.com/xvjiarui/GCNet 单位: 清华,香港科技大学,微软 摘要: 非局域网(NLNet)通过将查询特定的全局上

点云语义分割:论文阅读简记 -Spatial Transformer Point Convolution

[1] Spatial Transformer Point Convolution 为了满足点云置换不变性问题,以往的方法通过max或者sum来进行特征聚合,但是这种操作是各向同的,不能更好的建模局部几何结构。本文提出spatial transformer point convolution试图实现各相异性的滤波器。引入空间方向字典来捕获点云的几何结构。利用方向字典学习将无序的邻居转换成规范有序

cubic convolution interpolation (三次卷积插值)

算法来源:Cubic convolution interpolation for digital image processing 文章只对一维情形进行分析,二维类似。 许多插值函数能够写成形式(其中是插值点,u是基函数(文章中叫插值核),h是采样间隔,是参数) 通过插值,用来近似。 cubic convolution interpolation 中插值核u定义为子区间(-2,