高维前缀和
高维前缀和、快速莫比乌斯变换
高维前缀和#
问题#
给定数组
解法#
常规做法是使用
用高维前缀和可以做到
具体来说,按一定顺序枚举全集
假设现在枚举到了
因为
参考代码#
copy 了别人写的代码
void SUM(int *a,int n){for(int i=0;i<n;i++)for(int j=0;j<(1<<n);j++)if(j&(1<<i))a[j]+=a[j^(1<<i)];}
高维差分#
只需将高维前缀和中的 +
变成 -
即可。想象前缀和与差分,不正是把 +
变 -
了吗?
高维后缀和#
将
快速莫比乌斯变换#
问题#
给定
解法#
对
例题#
CF165E#
板题,只是因为这里应当有一份我的代码。
// g++ e.cpp -o e -std=c++14 -Wall -Wextra -Wshadow -O2
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, V = 1 << 22;
int f[V], a[N];
int main()
{
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
f[a[i]] = a[i];
}
for (int i = 0; i < 22; ++i)
{
for (int j = 0; j < V; ++j)
{
if (j >> i & 1)
{
if (!f[j])
f[j] = f[j ^ (1 << i)];
}
}
}
for (int i = 1; i <= n; ++i)
{
if (!f[(V - 1) ^ a[i]])
{
cout << "-1 ";
}
else
{
cout << f[(V - 1) ^ a[i]] << " ";
}
}
}
Dirichlet 前缀和#
以每一个质数作为一维,则 Dirichlet 前缀和本质上就是高维前缀和。
但质数实际上非常多,每一个开一维不可接受,但有用状态数为
for (int i = 1; i <= pril; ++i)
for (int j = 1; j * pri[i] <= n; ++j)
s[j * pri[i]] += s[j];
作者:Terminator-Line
出处:https://www.cnblogs.com/Terminator-Line/p/18722819
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话