数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录

  • 前提知识复习
  • T1:余数求和
    • title
    • solution
    • code
  • T2:Ice Rain
    • title
    • solution
    • code
  • T3:The Fool
    • title
    • solution
    • code
  • T4:模积和
    • title
    • solution
    • code

前提知识复习

整除分块是用于快速处理形似下列式子的方法,是解决莫比乌斯反演类题目需要掌握的前提知识
∑i=1n⌊ni⌋\sum_{i=1}^n\lfloor\frac{n}{i}\rfloori=1nin
但是本篇博客的例题是特别特别板的,不会涉及莫比乌斯反演,请dalao们出门左转别浪费时间,蟹蟹
回归正题,很显然上面的式子可以O(n)O(n)O(n)得到答案
但是,在某些题目中,毒瘤出题人将数据加强到了 101010^{10}1010以上
这个时候我们就无法通过O(n)O(n)O(n) 的解法来得到答案
我们需要一个O(n)O(\sqrt{n})O(n)的更为优秀的解法

对于单一的⌊ni⌋\lfloor\frac{n}{i}\rfloorin,某些地方的值是相同的,并且呈块状分布
通过深入的探求规律与严密推理以及暴力打表与幸运瞎猜 ,最后惊奇的发现这些块状分布的值是有规律的
对于一个块,假设它的起始位置的下标为lll,那么可以得到的是,它的结束位置的下标为在这里插入图片描述
代码表示即为

r = n / ( n / l );

分块如果非要安排一个模板的话,那就是一个forforfor循环了
在这里插入图片描述

int calc( int n ) {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );//根据题目要求进行计算 }return ans;
}

有的时候不同的题目可能出现n/l==0n/l==0n/l==0的情况,为了防止程序挂掉,我们也可以这么写

int calc( int n ) {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {if( k / l ) r = min( k / ( k / l ), n );else r = n;//根据题目要求进行计算}return ans;
}

具体的就用例题来体会吧

T1:余数求和

title

添加链接描述

solution

G(n,k)=∑i=1nkmodi=∑i=1n(k−⌊ki⌋∗i)=∑i=1nk−∑i=1n⌊ki⌋∗iG(n,k)= ∑_{i=1}^n k\ mod\ i=\sum_{i=1}^n(k-\lfloor\frac{k}{i}\rfloor*i)=\sum_{i=1}^nk-\sum_{i=1}^n\lfloor\frac{k}{i}\rfloor*iG(n,k)=i=1nk mod i=i=1n(kiki)=i=1nki=1niki
前面的求和式子可以很直观地得到∑i=1nk=n∗k\sum_{i=1}^nk=n*ki=1nk=nk
后面的求和式子我们令lll表示这个块的开始下标,rrr为这个块的结束下标,T=⌊ni⌋T=\lfloor\frac{n}{i}\rfloorT=in,则该块里面的值为:
∑i=lrT∗i=∑i=lrT−∑i=lri\sum_{i=l}^rT*i=\sum_{i=l}^rT-\sum_{i=l}^rii=lrTi=i=lrTi=lri
答案显而易见了吧,第一个求和就是个定值(r−l+1)∗T(r-l+1)*T(rl+1)T,后面的求和就是等差数列

计算方法:首项加末项乘以项数除以二=>(l+r)∗(r−l+1)/2(l+r)*(r-l+1)/2(l+r)(rl+1)/2

code

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
signed main() {int n, k;scanf( "%lld %lld", &n, &k );int ans = n * k;for( int l = 1, r;l <= n;l = r + 1 ) {if( k / l ) r = min ( k / ( k / l ), n );else r = n;ans -= ( r - l + 1 ) * ( k / l ) * ( l + r ) / 2;}printf( "%lld", ans );return 0;
}

T2:Ice Rain

title

添加链接描述

solution

读完题后是不是
在这里插入图片描述
一模一样的吧,这种sb题 你加一个无线输入操作就ACACACpasspasspass,下一个!!

code

#include <cstdio>
#include <iostream>
using namespace std;int main() {long long n, k;while( ~ scanf( "%lld %lld", &n, &k ) ) {long long ans = n * k;for( long long l = 1, r;l <= n;l = r + 1 ) {if( k / l ) r = min( k / ( k / l ), n );else r = n;ans -= ( k / l ) * ( l + r ) * ( r - l + 1 ) / 2;}printf( "%lld\n", ans );}return 0;
}

T3:The Fool

title

添加链接描述

solution

一样的吧?差不多的吧?如果你没有一点思路的话,证明我写的太差 没有学懂哦~
∑i=1n⌊ni⌋∑_{i=1}^n \lfloor\frac{n}{i}\rfloori=1nin,先分出每个块,然后再等差数列求和,加在一起最后判断,vanvanvan
在这里插入图片描述

code

#include <cstdio>
int main() {int T;scanf( "%d", &T );for( int Case = 1;Case <= T;Case ++ ) {long long n;scanf( "%lld", &n );long long ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );ans += ( r - l + 1 ) * ( n / l );} if( ans & 1 ) printf( "Case %d: odd\n", Case );else printf( "Case %d: even\n", Case );}return 0;
}

T4:模积和

title

添加链接描述

solution

这道题就是个重头戏了,其实也很简单的
仔细看推导过程!!
ans=∑i=1n∑j=1m(nmodi)×(mmodj),i≠jans=∑_{i=1}^n∑_{j=1}^m(n\ mod\ i)×(m\ mod\ j),i≠jans=i=1nj=1m(n mod i)×(m mod j),i=j
用容斥拆开把i=ji=ji=j的情况减掉即可
ans=∑i=1n∑j=1m(nmodi)×(mmodj)−∑i=1min(n,m)(nmodi)×(mmodi)ans=∑_{i=1}^n∑_{j=1}^m(n\ mod\ i)×(m\ mod\ j)-∑_{i=1}^{min(n,m)}(n\ mod\ i)×(m\ mod\ i)ans=i=1nj=1m(n mod i)×(m mod j)i=1min(n,m)(n mod i)×(m mod i)
直接把显而易见能分块的先分了来,再暴力展开
∑i=1n(nmodi)=∑i=1nn−∑i=1n⌊ni⌋∗i∑_{i=1}^n(n\ mod\ i)=\sum_{i=1}^nn-\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor*ii=1n(n mod i)=i=1nni=1nini
∑j=1m(mmodj)=∑j=1mm−∑j=1m⌊mj⌋∗j∑_{j=1}^m(m\ mod\ j)=\sum_{j=1}^mm-\sum_{j=1}^m\lfloor\frac{m}{j}\rfloor*jj=1m(m mod j)=j=1mmj=1mjmj
∑i=1min(n,m)(nmodi)×(mmodi)=∑i=1min(n,m)(n−⌊ni⌋∗i)∗(m−⌊mi⌋∗i)∑_{i=1}^{min(n,m)}(n\ mod\ i)×(m\ mod\ i)=\sum_{i=1}^{min(n,m)}(n-\lfloor\frac{n}{i}\rfloor*i)*(m-\lfloor\frac{m}{i}\rfloor*i)i=1min(n,m)(n mod i)×(m mod i)=i=1min(n,m)(nini)(mimi)
=∑i=1min(n,m)(nm+⌊mi⌋⌊ni⌋i2−⌊mi⌋i−⌊ni⌋i)=\sum_{i=1}^{min(n,m)}(nm+\lfloor\frac{m}{i}\rfloor\lfloor\frac{n}{i}\rfloor i^2-\lfloor\frac{m}{i}\rfloor i-\lfloor\frac{n}{i}\rfloor i)=i=1min(n,m)(nm+imini2imiini)
整理综上
在这里插入图片描述
ans=(∑i=1nn−∑i=1n⌊ni⌋∗i)(∑i=1mm−∑i=1m⌊mi⌋∗i)−∑i=1min(n,m)(nm+⌊mi⌋⌊ni⌋i2−⌊mi⌋i−⌊ni⌋i)ans=(\sum_{i=1}^nn-\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor*i)(\sum_{i=1}^mm-\sum_{i=1}^m\lfloor\frac{m}{i}\rfloor*i)-\sum_{i=1}^{min(n,m)}(nm+\lfloor\frac{m}{i}\rfloor\lfloor\frac{n}{i}\rfloor i^2-\lfloor\frac{m}{i}\rfloor i-\lfloor\frac{n}{i}\rfloor i)ans=(i=1nni=1nini)(i=1mmi=1mimi)i=1min(n,m)(nm+imini2imiini)
最后我们发现i2i^2i2在分块的时候挂掉了,OMG,怎么办!!,告诉你一个结论

∑ini2=n∗(n+1)∗(2n+1)/2∑_i^ni^2=n∗(n+1)∗(2n+1)/2ini2=n(n+1)(2n+1)/2

在这里插入图片描述
最后注意避雷!!!ppp不是个质数,稍微用随便找个互质的数搞个逆元就好了

code

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define mod 19940417
int n, m, inv;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}int sqr( int x ) {return x * ( x + 1 ) % mod * ( x << 1 | 1 ) % mod * inv % mod;
}int sum( int l, int r ) {return ( l + r ) * ( r - l + 1 ) / 2 % mod;
}int calc( int n ) {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );ans = ( ans + n * ( r - l + 1 ) % mod - ( n / l ) * sum( l, r ) % mod + mod ) % mod;}return ans;
}signed main() {inv = qkpow( 6, 17091779 );scanf( "%lld %lld", &n, &m );int ans = calc( n ) * calc( m ) % mod;if( n > m ) swap( n, m );for( int l = 1, r;l <= n;l = r + 1 ) {r = min( n / ( n / l ), m / ( m / l ) );int sum1 = n * m % mod * ( r - l + 1 ) % mod;int sum2 = ( n / l ) * ( m / l ) % mod * ( sqr( r ) - sqr( l - 1 ) + mod ) % mod;int sum3 = ( n / l * m % mod + m / l * n % mod ) * sum( l, r ) % mod;ans = ( ans - ( sum1 + sum2 - sum3 + mod ) % mod + mod ) % mod;}printf( "%lld", ans );return 0;
}

走了,题还没做完…
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SP1557 GSS2 - Can you answer these queries II(离线 线段树)

SP1557 GSS2 - Can you answer these queries II \(\bigstar\texttt{Hint}\)&#xff1a;遇到去重的问题&#xff0c;我们通常考虑离线询问后处理。 可以枚举右端点&#xff0c;将询问存储在右端点&#xff0c;考虑用数据结构记录左端点的信息。 那么我们如果用线段树维护左端点…

模板:K-D tree

文章目录前言思想能解决的问题操作建树询问修改完整代码所谓KDtree&#xff0c;就是有K个D的树 &#xff08;逃&#xff09; 前言 KDtree是一种解决多维问题的暴力数据结构 K维状态下的最差复杂度是nk−1/kn^{k-1/k}nk−1/k 在最常见的2Dtree中就是根号n 但是玄学的它常常能到…

AT3877-[ARC089C]GraphXY【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT3877 题目大意 给出一个大小为ABA\times BAB的矩阵ddd 要求构造一个点数不超过300300300的有向图满足 图中没有重边和自环图中的边权为[0,100][0,100][0,100]的整数或者未知数X/YX/YX/Y对于所有X∈[1,A],Y∈[1,B]X\in[1,A…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

CF856D Masha and Cactus(树上 DP+抵消贡献技巧)

CF856D Masha and Cactus 我们先捞出一个根节点&#xff0c;那么一次旋变就是对路径上点的覆盖。 设 \(dp_{i,0}\) 表示 \(i\) 没有选择时子树内最大收益&#xff0c;\(dp_{i,1}\) 表示 \(i\) 选择时子树内最大收益&#xff0c;那么将每条边存在 \(lca\) 上。 之后贡献怎么算&a…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

P5933 [清华集训2012]串珠子(连通性 状压 计数)

P5933 [清华集训2012]串珠子 \(\color{yellow}{\bigstar\texttt{Trick}}\)&#xff1a;遇到连通性题可以暂时忽略是否联通。 设 \(g_s\) 表示集合为 \(s\) 的点的子图有多少个&#xff0c;可以不连通&#xff1b;\(f_s\) 表示答案。 那么 \(g_s\) 可以直接计算 \(g_s\prod_{(i&…

AT2365-[AGC012E]Camel and Oases【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2365 题目大意 一个数轴上有nnn个点&#xff0c;开始你有个水壶容量为VVV&#xff0c;你每次有两个操作 走到一个距离与你不超过VVV的点让V⌊V2⌋V\lfloor\frac V2\rfloorV⌊2V​⌋&#xff0c;然后跳到任意一个点。 对于…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

模版:替罪羊树

文章目录前言注意事项代码所谓替罪羊树&#xff0c;就是有一头替罪羊的树 &#xff08;逃&#xff09; 前言 在看完了一大堆各种平衡树的教程之后&#xff0c;决定学一个这个 因为它有一个很关键的好处&#xff1a;无须旋转 可以在pushup复杂度太恶心的题中做到splay做不到的…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

P7154 [USACO20DEC] Sleeping Cows P(DP)

主要是状态设计比较难想&#xff0c;但其实可以理性地推出来。 P7154 [USACO20DEC] Sleeping Cows P 考虑最终一个合法状态是怎么样的&#xff1a;一定是一堆小牛棚&#xff0c;一堆大奶牛&#xff0c;最大的牛棚小于最小的奶牛。 这启发我们将所有牛和牛棚放在一起&#xff0c…

AT2370-[AGC013D]Piling Up【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2370 题目大意 有nnn个黑白球&#xff0c;但是具体颜色个数不确定&#xff0c;进行mmm次操作&#xff1a;拿出一个球然后放入黑白球各一个&#xff0c;再拿出一个球。 求最后颜色序列的种类数。 1≤n,m≤30001\leq n,m\le…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…

[FWT] 时隔一年再回首FWT(快速沃尔什变换),我终于不再是个门外汉

时隔一年再回首FWT&#xff0c;我似乎有了新理解&#xff1f;&#xff1f; 添加了原理的推导&#xff0c;以前就只有模板… 文章目录引入or&#xff08;或&#xff09;卷积原理FWT_or正变换FWT_or逆变换模板and&#xff08;与&#xff09;卷积原理FWT_and正变换FWT_and逆变换模…

模板:多项式乘法(FFTNTT)

文章目录前言系数表示法和点值表示法单位根离散傅立叶变换&#xff08;DFT&#xff09;位逆序置换&#xff08;蝴蝶变换&#xff09;离散傅立叶逆变换&#xff08;IDFT&#xff09;代码NTT代码所谓快速傅立叶变换&#xff0c;就是傅立叶发明的一种快速的变换 &#xff08;逃&am…