题目

  点这里看题目。

分析

  可以发现,符合条件的分数约分后,其分母必须为\(2^m5^k\)。因此,原分数一定可以表示为:

\[\frac{XY}{2^m5^kX}
\]

  其中\((10,X)=1, XY\le n, 2^m5^kX\le n\)。

  可以发现,这样枚举可以保证分母不重复,因而保证枚举出的分数不重复。

  考虑\(X\)的大小限制:

\[ 2^m5^kX \le n\Rightarrow X\le \lfloor\frac n {2^m5^k}\rfloor
\]

  再考虑\(Y\)对\(X\)的影响。设阈值\(T=\lfloor\frac n{\lfloor\frac n {2^m5^k}\rfloor}\rfloor\)。当\(Y<T\)时,\(X\)受到上式的约束;当\(Y\ge T\)时,\(X\)受到条件\(XY\le n\)的约束。

  设\(p(x)=\sum_{i=1}^x[(10,i)=1]\),即\([1,x]\)中与\(2,5\)互质的数的个数,我们可以用容斥原理快速计算\(p\)的值。

  发现,如果用\(f(y)\)表示当\(Y=y\)时,\(X\)的取值的个数,那么它就是一个分段函数:

\[f(y)=
\begin{cases}
p(\lfloor\frac n {2^m5^k}\rfloor) & y<T\\
p(\lfloor\frac n y\rfloor) & y \ge T
\end{cases}
\]

  当\(m,k\)确定时,答案即为\(\sum_{i=1}^n f(i)\)。当\(y<T\)时,贡献可以直接暴力计算;当\(y>T\)时,我们可以预处理前缀和。

  \(m\)和\(k\)都可以枚举,因此计算答案的时间是\(O(n+\log_2n\log_5n)\)。

  恭喜,有 80pts 了

  考虑优化,由于\(T\)的取值数量为\(O(\sqrt n)\),因此我们可以直接数论分块,留下需要的点求出前缀和。时间复杂度\(O(\sqrt n + \log_2n\log_5n)\)。

代码

#include <cmath>
#include <cstdio> typedef long long LL; #define int LL const int MAXN = 2e6 + 5; template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
} template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
} template<typename _T>
_T MIN( const _T a, const _T b )
{
return a < b ? a : b;
} LL su[MAXN], seq[MAXN], p2[MAXN], p5[MAXN];
int id1[MAXN], id2[MAXN];
LL N, rt, ID; int& getID( const LL v )
{
if( v <= rt ) return id1[v];
return id2[N / v];
} LL query( LL up ) { return up - up / 2 - up / 5 + up / 10; } signed main()
{
read( N ), rt = sqrt( N );
for( LL l = 1, r, v ; l <= N ; l = r + 1 )
{
r = N / ( v = N / l );
seq[++ ID] = v, getID( v ) = ID;
}
for( int i = ID ; i ; i -- ) su[i] = su[i + 1] + ( seq[i] - seq[i + 1] ) * query( N / seq[i] );
LL ans = 0;
int siz2, siz5;
p2[0] = 1, p5[0] = 1;
for( siz2 = 0 ; p2[siz2] <= N ; ) siz2 ++, p2[siz2] = p2[siz2 - 1] << 1;
for( siz5 = 0 ; p5[siz5] <= N ; ) siz5 ++, p5[siz5] = p5[siz5 - 1] * 5;
for( int i = 0 ; i < siz2 ; i ++ )
for( int j = 0 ; j < siz5 && p2[i] * p5[j] <= N ; j ++ )
if( p2[i] * p5[j] <= N )
{
LL tmp = N / ( N / p2[i] / p5[j] );
ans += su[getID( N )] - su[getID( tmp )] + query( N / tmp ) + ( tmp - 1 ) * query( N / p2[i] / p5[j] );
}
write( ans ), putchar( '\n' );
return 0;
}

【LGR-072】回首过去的更多相关文章

  1. Laravel 部署安装到虚拟主机的方法(折腾了一周,终于成功部署,原来是虚拟机不加载.env,谢谢莫回首http://lxl520.com/index.php/archives/88/!)

      作者:莫回首链接:https://www.zhihu.com/question/35497879/answer/111241182来源:知乎著作权归作者所有,转载请联系作者获得授权. 序 lara ...

  2. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

  3. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  4. 再回首UML之下篇

    接着我们上篇博客再回首UML之上篇说,在类图中有四种关系,关联.依赖.泛化.实现,接下来,我们来看看依赖,依赖--描述的是一种使用关系,她说明一个事物的规格说明的变化可能影响到他使用的另一个事物,反之 ...

  5. 再回首UML之上篇

    UML,统一建模语言,是一种用来对真实世界物体进行建模的标准标记,这个建模的过程是开发面向对象设计方法的第一步,UML不是一种方法学,不需要任何正式的工作产品. UML提供多种类型的模型描述图,当在某 ...

  6. 谷歌Gmail诞生记:十年回首

    美国<时代>周刊网络版今天刊登题为<Gmail诞生记:10年前鲜为人知的故事>(How Gmail Happened: The Inside Story of Its Laun ...

  7. UML——再回首

    概述     在画图的过程中,发现自己还是有好多不懂的地方,对于四大关系理解的不是特别透彻,所以画图的过程中总是"剪不断,理还乱!"再一次整理四大关系,再回首必然丰收~~~ 1.实 ...

  8. Dubbo 系列(07-2)集群容错 - 服务路由

    目录 Dubbo 系列(07-2)集群容错 - 服务路由 1. 背景介绍 1.1 继承体系 1.2 SPI 2. 源码分析 2.1 创建路由规则 2.2 RouteChain 2.3 条件路由 Dub ...

  9. luogu P6583 回首过去 简单数论变换 简单容斥

    LINK:回首过去 考试的时候没推出来 原因:状态真的很差 以及 数论方面的 我甚至连除数分块都给忘了. 手玩几个数据 可以发现 \(\frac{x}{y}\)满足题目中的条件当且仅当 这个是一个既约 ...

  10. 回首Java——写在前面

    我记得在大学的课程要求中,第一个接触的高级编程语言,应该是C语言或者C++等.但是Java应该是我的编程母语,我在高中毕业就接触了Java语言.当时看的是纸质书,具体书名也忘记了.只记得当时第一次接触 ...

随机推荐

  1. Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc

    问题 出现报错: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc 原因 缺失两个库文件: as ...

  2. 统计元音(hdu20)

    输入格式:输入一个整型,再循环输入带空格的字符串. 思考:先用scanf()函数输入一个整型,后面直接来个大循环,带空格字符串输入直接用gets()函数. 注意:由于scanf()里面多加了%c,&a ...

  3. 循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

    之前一直采用VS进行各种前端后端的开发,随着项目的需要,正逐步融合纯前端的开发模式,开始主要选型为Vue + Element 进行BS前端的开发,后续会进一步整合Vue + AntDesign的界面套 ...

  4. TensorFlow的checkpoint文件转换为pb文件

    由于项目需要,需要将TensorFlow保存的模型从ckpt文件转换为pb文件. import os from tensorflow.python import pywrap_tensorflow f ...

  5. centos系统与ubuntu系统的区别

    centos和ubuntu简述 CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Lin ...

  6. pix三接口配置

    拓扑 R1 R1#conf t Enter configuration commands, one per line. End with CNTL/Z. R1(config)#int f0/0 R1( ...

  7. Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.如何实现事物控制.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/c ...

  8. Java实现 蓝桥杯 算法提高VIP Substrings(暴力)

    试题 算法提高 Substrings 问题描述 You are given a number of case-sensitive strings of alphabetic characters, f ...

  9. Java实现 LeetCode 528 按权重随机选择(TreeMap)

    528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...

  10. Java实现 蓝桥杯VIP 算法训练 P0504

    算法训练 P0504 时间限制:1.0s 内存限制:256.0MB Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,Uncl ...