题目

  点这里看题目。

分析

  可以发现,符合条件的分数约分后,其分母必须为\(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. hdu6005找带权最小环

    题意:给你点和边,让你找最小环的权值,其权值是所有边权的和,没环输出-1. 解法:枚举每一条边,找到其端点,做最短路.. #include<cstdio> #include<cstr ...

  2. 针对移动端开发的响应式 Jekyll 主题

    simple 这是针对移动端开发的响应式 Jekyll 主题,效果看 demo,源码在 GitHub,觉得不错点个 star. 主题特性包括但不限于: 在线编辑.新建.发布文章 GitHub 官方语法 ...

  3. 【百度网盘活动】扩容2T+7天会员

    https://pan.baidu.com/component/view?id=455 https://pan.baidu.com/union/smartProgramShare?scheme=bdn ...

  4. nodejs链接mysql 中的问题

    首先你得对mysql ,有个大概的认识. 比如说:如何安装,使用基本的语法,测试安装是否能成功,以及成功之后简单的对于数据库的,操作(增删改查)... 下面是业务场景:在爬虫过程中,租后需要将信息输出 ...

  5. centos 删除文件提示 Operation not permitted

    如果文件上存在 i 标记,那肯定是删不掉的,同样这个文件也不能被编辑.可以进入 root 模式,去除这个标记: root@ubuntu:/home/barret/work# chattr -i 1.m ...

  6. jq代替jsdom操作部分

    接触js后学习了一些js操作html的方法    js可以配合css完成许多动画和操作.初次接触jquery感觉不是很习惯,毕竟js有了习惯,但是jq还是省去了很多繁琐的操作步骤.    首先使用之前 ...

  7. 关于lua的那些事

    1.lua是一个脚本语言,由巴西里约热内卢天主教大学Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究 ...

  8. 【译】OWIN: Open Web Server Interface for .NET

    主要是使用 OAuth 时,它运行在 OWIN 上,然后又出了若干问题,总之,发现对 IIS.ASP.NET 和 OWIN 理解一塌糊涂. 后面看到 OWIN: Open Web Server Int ...

  9. 剑指offer——数据结构

    技术面重点:数组.字符串.链表.树.栈以及队列.

  10. eatwhatApp开发实战(二)

    上期,我们做了个小app“eatwhat”,接下来每期都会为其添加新的功能.本期,我们为店铺增加添加店铺的功能. 还是先设置个布局: <RelativeLayout android:layout ...