BZOJ3529 : [Sdoi2014]数表(反演+BIT)

2024-02-05 14:58

本文主要是介绍BZOJ3529 : [Sdoi2014]数表(反演+BIT),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SDOI真的是什么毒瘤题都有qwq
这个题首先推式子的步骤我就不说了
最后长这个样子:(N<=M) (f(d)代表约数和函数)

T=1NNTMTd|Tf(d)μ(Td) ∑ T = 1 N ⌊ N T ⌋ ⌊ M T ⌋ ∑ d | T f ( d ) ∗ μ ( T d )
如果没有a的限制,这样就可以了
我们考虑如何处理那个限制
我们对询问离线,按照a排序
线性筛出来约数和以及莫比乌斯函数
我们按顺序插入每一个f(d)
每次枚举d的倍数计算对前缀和的贡献
树状数组维护前缀和
分块查询答案
要注意自然溢出,不然会TLE
O(maxn+Q(n+m)logmaxn) O ( m a x n + Q ( n + m ) l o g m a x n )
代码:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
inline int read(){int x=0,f=1;char ch=' ';while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return f==1?x:-x;
}
const int N=1e5+5;
int cnt,prime[N],vis[N],f[N],mu[N],g[N];
inline void init(int n){f[1]=1;mu[1]=1;g[1]=1;for(int i=2;i<=n;++i){if(!vis[i]){prime[++cnt]=i;mu[i]=-1;g[i]=1;f[i]=i+1;}for(int j=1;j<=cnt && i*prime[j]<=n;++j){vis[i*prime[j]]=1;if(i%prime[j]==0){mu[i*prime[j]]=0;g[i*prime[j]]=g[i];f[i*prime[j]]=f[i]*prime[j]+f[g[i]];break;}else{mu[i*prime[j]]=-mu[i];g[i*prime[j]]=i;f[i*prime[j]]=f[i]*f[prime[j]];}}}
}
const int Lim=1e5;
int t[N];
inline void add(int x,int v){while(x<=Lim){t[x]+=v;x+=x&-x;}
}
inline int query(int x){int ans=0;while(x){ans+=t[x];x-=x&-x;}return ans;
}
struct Query{int n,m,lim,id;Query(){}inline bool operator < (const Query& b) const {return lim<b.lim;}
}q[N];
struct Insert{int x,v;Insert(){}inline bool operator < (const Insert& b) const {return v<b.v;}
}I[N];
int mxval,num,Ans[N];
int main(){init(1e5);int T=read();for(int i=1;i<=T;++i){q[i].n=read();q[i].m=read();q[i].lim=read();q[i].id=i;mxval=max(mxval,q[i].lim);}sort(q+1,q+T+1);for(int i=1;i<=Lim;++i){if(f[i]<=mxval){I[++num].x=i;I[num].v=f[i];}}sort(I+1,I+num+1);int now=1;I[num+1].v=0x3f3f3f3f;for(int s=1;s<=T;++s){while(I[now].v<=q[s].lim){int p=I[now].x;for(int i=1;i*p<=Lim;++i){add(i*p,I[now].v*mu[i]);}now++;}int n=q[s].n,m=q[s].m;if(n>m)swap(n,m);int ans=0;for(int i=1,j=0;i<=n;i=j+1){j=min(n/(n/i),m/(m/i));ans+=(n/i)*(m/i)*(query(j)-query(i-1));}Ans[q[s].id]=ans;}for(int i=1;i<=T;++i){Ans[i]&=2147483647;printf("%d\n",Ans[i]);}return 0;
}

这篇关于BZOJ3529 : [Sdoi2014]数表(反演+BIT)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

hdu6053 TrickGCD 莫比乌斯反演

TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description You are given an array  A  , and Zhu wants to know there are how many d

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

【HDU】5333 Undirected Graph【LCT+BIT】

传送门:【HDU】5333 Undirected Graph my  code: my~~code: #pragma comment(linker, "/STACK:1024000000")#include <stdio.h>#include <string.h>#include <map>#include <algorithm>using namespace std ;typed

【HDU】5574 Colorful Tree【子树染色,询问子树颜色数——线段树+bit+lca+set】

题目链接:【HDU】5574 Colorful Tree 题目大意:对一个子树染色,询问一个子树的颜色数。 题目分析: set set维护每种颜色所在的 dfs dfs序区间,修改均摊 nlogn nlogn。 #include <bits/stdc++.h>using namespace std ;typedef long long LL ;typedef pair < int , i

P3313 [SDOI2014] 旅行(分块做法)

~~~~~      P3313 [SDOI2014] 旅行 ~~~~~      总题单链接 思路 ~~~~~      遇到这种树上路径问题,就考虑用重链剖分转为区间问题。 ~~~~~      问题转换为了:给定一个区间和 k k k,求这个区间内信仰为 k k k 的城市的 权值和 或 最大权值。 ~~~~~      这个问题也可以用动态开点线段树解决(现在不会,以后

学习笔记 ---- 莫比乌斯反演总结

文章目录 概述前置知识数论分块狄利克雷卷积积性函数 莫比乌斯函数定义性质 莫比乌斯反演因子形式倍数形式 例题周期性字符串互质数对[NOI2010D1T1]能量采集BZOJ2820 YY的GCD[SDOI2015] 约数个数和BZOJ4407 于神之怒加强版【BZOJ2693】jzptab最小公倍数之和[bzoj3529-Sdoi2014] 数表 练习题51nod 1675 序列变换BZOJ3

Python基础知识:bit(比特)与Byte(字节)的区别与关系

1.bit:位 (小写b) 也称比特 是英文 binary digit的缩写 二进制数系统中,每个0或1就是一个位(bit) 位是数据存储(计算机中信息)的最小单位 计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据 2.Byte:字节(大写B) 8bit就称为一个字节(Byte), 1Byte=8bit 记为Byte或B,是计算机中信息的

mysql关于bit类型用法

本文来源于:http://www.server110.com/mysql/201403/7117.html Mysql关于bit类型的用法: 官方的资料如下: 9.1.5. 位字段值 可以使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。 位字段符号可以方便指定分配给BIT列的值: mysql> CREATE TABLE t (b BIT

【华为OJ】求最大连续bit数

题目描述 功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字 输出: 无 返回: 对应的二进制数字中1的最大连续数 输入描述: 输入一个byte数字 输出描述: 输出转成二进制之后连续1的个数 输入例子: 3 输出例子: 2 题目分析 方法一:将输入数字转换成二进制,统计连

TensorFlow 2.1.0 + Windows 10 - 64 bit + Python 3.7 安装

先来看看TensorFlow2.1.0安装要求 那就先安装 Python3.7 !!!!!!!!!!!!! 在使用Python时,我们经常需要用到很多第三方库,例如,上面提到的Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。 推荐直接安装 Anaconda,刚好支持Python3.7 下载-安装,一