标题也许叫整除分块吧

求\(1\)到\(n\)因数的个数\(\sum_{i=1}^n(\sum_{d|n}1)\)

范围\(1e14\)时限3s

\(n\sqrt{n}\)的暴力铁定gg

分开考虑

\(1\)到\(n\)中含有\(1\)因数的个数有\(n/1\)个

含有2因数的个数有\(n/2\)个**

······

含有n因数的个数有\(n/n\)个

问题就转化为求\(\sum_{i=1}^{n}[\frac{n}{i}]\)

然后我们就可以把\(O(n\sqrt{n})\)的暴力转化为\(O(n)\)了

可还是过不了&1e14的数据&

我们发现,我们求得\(\frac{n}{i}\)在一段区间内是连续的

而且呈现单调递减,这样我们就可以开心的套用二分啦

那到底有多少段连续的区间

把i分开考虑

1到\(\sqrt{n}\)之内,if都不同撑死有\(\sqrt{n}\)段

\(\sqrt{n}\)到n之内,求\(\frac{n}{i}\)连续的一段,取值范围为1到\(\sqrt{n}\)之内,撑死也有\(\sqrt{n}\)个

区间个数是\(\sqrt{n}\)级别的,二分是\(log\)级别的

所以复杂度为\(O(\sqrt{n}logn)\)

一直以为这是根号的%>_<%

参见牛客练习赛25(1e9)

#include <bits/stdc++.h>
using namespace std;
long long ans;
int l,n;
int main() {
int q;
cin>>q;
while(q--) {
cin>>n;
l=1;
ans=0;
for(int i=1; i<=n; ++i) {
int r=n;
int mid=(l+r)>>1;
while(n/l!=n/r) {
mid=(l+r)>>1;
r=mid;
}
ans+=n/l*(r-l+1);
if(r==n) break;
l=r+1;
}
cout<<ans<<"\n";
}
return 0;
}

直到我遇到了这个题luogu3935以及评测80sTLE的惨痛

才发现我是个zz诶

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\) \(10\) \(11\) \(12\)
\(n/i\) \(12\) \(6\) \(4\) \(3\) \(2\) \(2\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\)

当我们知道\(l\)的时候,也就是一段的开头,如何快速找到我们要的r呢

\(n/l\)是\(n\)中含有\(t=n/l\)块完整的\(l\)

那么\(n/t\)便是有\(t\)块最大的数,便是我们要求的\(r\)

所以\(r=n/(n/l)\)

所以我们求块的时间由二分的\(O(logn)\)变为了\(O(1)\)

复杂度为\(O(\sqrt{n})\)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=998244353;
ll solve(ll n)
{
ll ans=0;
for(ll l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)%mod*(n/l)%mod;
ans%=mod;
}
return ans;
}
int main()
{
ll x,y;
cin>>x>>y;
cout<<((solve(y)-solve(x-1))%mod+mod)%mod;
return 0;
}

http://www.cnblogs.com/1000Suns/p/9193713.html

luogu3935 Calculating的更多相关文章

  1. 长时间停留在calculating requirements and dependencies 解决方案

    如果Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 ) 这个问题通常就是在点击安装之后显示“Calculating ...

  2. 长时间停留在calculating requirements and dependencies 的解决方案

    如果Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 ) 这个问题通常就是在点击安装之后显示“Calculating ...

  3. Calculating Stereo Pairs

    Calculating Stereo Pairs Written by Paul BourkeJuly 1999 Introduction The following discusses comput ...

  4. Calculating simple running totals in SQL Server

    Running total for Oracle: SELECT somedate, somevalue,SUM(somevalue) OVER(ORDER BY somedate ROWS BETW ...

  5. Codeforces Round #277 (Div. 2) A. Calculating Function 水题

    A. Calculating Function Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/4 ...

  6. cf486A Calculating Function

    A. Calculating Function time limit per test 1 second memory limit per test 256 megabytes input stand ...

  7. Android ADT安装时卡在Calculating requirements and dependencies

    AndroidSDK及Eclipse安装都很顺利,但是在Eclipse下安装ADT插件时,先采用点击Help->installnew software->Add...,无论输入https: ...

  8. 长时间停留在calculating requirements and dependencies

    如果安装插件的时候,Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 )这个问题通常就是在点击安装之后显示“Calcu ...

  9. 洛谷P3935 Calculating (莫比乌斯反演)

    P3935 Calculating 题目描述 若xx分解质因数结果为\(x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n},令f(x)=(k_1+1)(k_2+1)\cdots ...

随机推荐

  1. Heavy Transportation---poj1797

    求(Dijkstra算法,求每条路径上的最小值 的最大值)和青蛙的那题类似:   #include<iostream> #include<stdio.h> #include&l ...

  2. 学习grunt四解决yo webapp生成的是gulpfile而不是gruntfile问题

    虽然gulp慢慢取代了gruntfile,但是还有大部分的github源码保留gruntfile,另外我们开发项目也不是全用gulp,也是用grunt. 但是yeoman上generator-weba ...

  3. poj1753Flip Game(dfs)

    Flip Game  思想很不成熟, #include <stdio.h>#include <string.h>#include <stdlib.h>int map ...

  4. PAT 1067 Sort with Swap[难]

    1067 Sort with Swap(0,*) (25)(25 分) Given any permutation of the numbers {0, 1, 2,..., N-1}, it is e ...

  5. data.frame和matrix的一些操作

    编写脚本的时候经常会涉及到对data.frame或matrix类型数据的操作,比如取指定列.取指定行.排除指定列或行.根据条件取满足条件的列或行等.在R中,这些操作都是可以通过简单的一条语句就能够实现 ...

  6. Build-in Function:abs(),all(),any(),assii(),bin(),issubclass(),bytearray(),isinstance()

    print('abs():输出绝对值,是absolute的缩写--------------') print(abs(-1)) print('all()与any()------------------- ...

  7. [LeetCode] 821. Shortest Distance to a Character_Easy tag: BFS

    Given a string S and a character C, return an array of integers representing the shortest distance f ...

  8. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  9. 将Mongo装为Windows的服务

    PHP的mongo扩展: 首先 下载一个PHP的mongo扩展, 地址:http://download.csdn.net/detail/qq_36387589/9819259 然后修改php.ini. ...

  10. 一个新人对HTML内JavaScript的理解

    首先是对于JavaScript(以后简称JS)的定义: ① JS他是一个脚本语言,有点类似于外部插件,需要插入引用才会有效 ② 他需要一个宿主文件,就是他插入到谁里面进行运算,谁就是这个JS的宿主文件 ...