首页 > 其他分享 >高维前缀和

高维前缀和

时间:2024-07-30 19:42:35浏览次数:13  
标签:前缀 int seed uint 维度 高维 define

二维前缀和是总所周知的,它长这样:

\[f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i-1][j-1] \]

这实际上是容斥原理。但我们还可以这样求 \(f\) 的前缀和:

for (int i = 1; i <= n; i++)
  for (int j = 1; j <= n; j++)
    f[i][j] += f[i][j - 1];

for (int i = 1; i <= n; i++) 
  for (int j = 1; j <= n; j++)
    f[i][j] += f[i - 1][j];

两个循环交换位置也是可以的,很容易证明。这样,我们还可以推广到三维:

for(int i = 1; i <= n; i ++)
  for(int j = 1; j <= n; j ++)
    for(int k = 1; k <= n; k ++)
      f[i][j][k] += f[i - 1][j][k];

for(int i = 1; i <= n; i ++)
  for(int j = 1; j <= n; j ++)
    for(int k = 1; k <= n; k ++)
      f[i][j][k] += f[i][j - 1][k];

for(int i = 1; i <= n; i ++)
  for(int j = 1; j <= n; j ++)
    for(int k = 1; k <= n; k ++)
      f[i][j][k] += f[i][j][k - 1];

这三个三重循环之间的顺序怎么交换都行,你可以先求j这个维度再求i这个维度最后再求k这个维度,都是等价的。\(n\) 维的同理。当每个维度都只有2个元素时,我们还可以直接状压dp。

由此我们可以引出这个题:

P5495 【模板】Dirichlet 前缀和

假设 \(x = ap_i^k\) ,\(y=ap_i^{k+1}\) ,其中 \(p_i\) 是 \(x\) 的某一个质因数,则很显然 \(b_y = b_x + 1\) 。那么,这不就是在 \(p_i\) 这个维度求前缀和吗?所以我们就可以直接高维前缀和了。code:

#include <bits/stdc++.h>
using namespace std;

#define debug
#define uint unsigned int
#define N 20000010

uint n;
uint a[N], p[N], cnt;
bool not_prime[N];
uint seed;
inline uint etnext() {
  seed ^= seed << 13;
  seed ^= seed >> 17;
  seed ^= seed << 5;
  return seed;
}

void init() {
  for (int i = 2; i <= n; i++) {
    if (!not_prime[i]) {
      p[++cnt] = i;
    }
    for (int j = 1; j <= cnt; j++) {
      if (1ll * i * p[j] > 1ll * N) break;
      not_prime[i * p[j]] = 1;
      if (i % p[j] == 0)  break;
    }
  }
}

signed main() {
//   freopen("shuju.in", "r", stdin);
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> seed;
  init();
  for(int i = 1; i <= n; i ++){
    a[i] = etnext();
  }
  for (int i = 1; i <= cnt; i++) {
    for(int j = 1; j * p[i] <= n; j ++){
      a[p[i] * j] += a[j];
    }
  }
  uint ans = 0;
  for(int i = 1; i <= n; i ++){
    ans ^= a[i];
  }
  cout << ans;
  return 0;
}

标签:前缀,int,seed,uint,维度,高维,define
From: https://www.cnblogs.com/yduck/p/18333221

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • js切割接口域名前缀。
    在请求图片时,可能会有有域名的,或没域名的地址,这就需要判断,把字符串域名把域名前缀剪切掉letdomain="https://www.example.com"; //剪切掉域名前缀functiontrimDomainPrefix(url){  //定义需要剪切的前缀列表  constprefixes=["http://","https://",......
  • 高维前缀和乱讲
    OI-Wiki看不懂啊,学了一上午。常见的二维前缀和求法多为容斥原理,虽然这样的计算相对直观且便于记忆,但是当维数往上升高时其复杂度会大大提高,对于更高维度的前缀和可以使用“高维前缀和”这一方法,本质上是基于DP的。首先我们可以了解一种一般的优化,我们先对每一“行”求前......
  • Vcpkg + cmake + pybind 问题“无法找到平台独立库 <前缀>”
    我发现了vcpkgerlier,它看起来很有趣,但是易于使用。据我了解,经过一天的调查,vcpkgpybind11与vcpkgpython搭配使用。但是当我启动一个简单的程序时,它被中止并出现以下输出无法找到平台独立库<前缀>这是一个已知问题,但不适用于vcpkgpython。我不知道为什么?不......
  • 前缀和与差分
    前缀和与差分前缀和定义:前缀和可以简单理解为「数列的前n项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。一维前缀和模板for(inti=1;i<=n;i++)sum[i]=sum[i-1]+a[i];时间复杂度:O(n)原理数组sum用于储存前i个元素的和,数组a......
  • 易优CMS模板标签SQL数据查询查询数据表ey_arctype,指定栏目ID的基本信息,不使用数据缓存
    【基础用法】标签:sql描述:用于获取MySQL数据库内容的标签。用法:{eyou:sqlsql=''cachetime='3600'empty='没有数据'}{$field.数据表相应的字段名称}{/eyou:sql}属性:sql=''需要查询的SQL语句cachetime='3600'数据缓存时间,默认缓存25小时,即86400秒empty=''没有数据时显示......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......