格点统计(分块&数学)
2018-01-30 22:03
113 查看
自己偶然看到的一个题目对它进行了进一步的思考。
我们可以列出以下的满足题意的点对
(1,4) (1,2) (1,3) (1,4)
(2,1) (2,2)
(3,1)
(4,1)
进一步思考,题意可转化为求∑i=1kki
暴力的话要k^2,但是显然我们可以不用枚举那么多,只要枚举根号k次就好了。
我们发现求k/i时,会出现一段的连续答案,于是我们可以采用分块!
假设当前做到的块开头是j,结尾时j’
那么我们可以在当前的块上统计答案,然后再跳下一段块
我们要使kj>=kj′
移项可得j′>=kkj
然后我们就可以愉快地分块计算了
时间复杂度可简化为O(根号k)
伪代码
题目大意
求第一象限中位于xy=k下面的点对的个数是多少?个人YY
我们可以先做一遍暴力(手玩也可以),比如说k=4时,我们可以列出以下的满足题意的点对
(1,4) (1,2) (1,3) (1,4)
(2,1) (2,2)
(3,1)
(4,1)
进一步思考,题意可转化为求∑i=1kki
暴力的话要k^2,但是显然我们可以不用枚举那么多,只要枚举根号k次就好了。
我们发现求k/i时,会出现一段的连续答案,于是我们可以采用分块!
分块
先枚举i从1到根号k假设当前做到的块开头是j,结尾时j’
那么我们可以在当前的块上统计答案,然后再跳下一段块
我们要使kj>=kj′
移项可得j′>=kkj
然后我们就可以愉快地分块计算了
时间复杂度可简化为O(根号k)
伪代码
#include<cstdio> typedef long long LL; const LL maxn=998244353; LL calc(LL n) { LL x=0,y,sum=0; while (x<=n) { y=n/(n/x); sum=(sum+(y-x+1)*(n/x)%modn)%modn; x=y+1; } return sum; } LL n; int main() { scanf("%lld\n",&n); printf("%lld\n",calc(n)); }
相关文章推荐
- 读数学之美——统计语言模型(马尔科夫)
- 数学之美 系列一 -- 统计语言模型
- 七月算法机器学习笔记1--机器学习中的数学之数理统计和参数估计
- 数理统计——生物统计学的数学基础
- 程序员的数学:概率统计(一)
- 数学建模————统计问题之仿真(四)
- HDU 2023 求平均成绩(数学统计题)
- lintcode 3. 统计数字 纯数学解法
- 数学与统计学习: 指数衰减应用(指数分布&对数分布)
- 【BZOJ4403】序列统计(组合数学,卢卡斯定理)
- HDU 4588 Count The Carries(数学统计)
- 机器学习(一)- 数学基础之统计概率
- 数学之美系列之一:统计语言模型
- 流式数据中的数学统计量计算
- [从头学数学] 第105节 整理与复习--统计与概率
- bzoj 4403: 序列统计【lucas+组合数学】
- 数学之美(系列一) 之 统计语言模型
- 数学统计好题——[Usaco2008 Dec]Patting Heads
- 【BZOJ4403】序列统计(组合数学,卢卡斯定理)
- 概率统计:数学期望、方差、协方差、相关系数