LightOJ 1098(均值不等式,整除分块玄学优化)

We all know that any integer number n is divisible by 1 and n. That is why these two numbers are not the actual divisors of any numbers. The function SOD(n) (sum of divisors) is defined as the summation of all the actual divisors of an integer number n. For example,

SOD(24) = 2+3+4+6+8+12 = 35.

The function CSOD(n) (cumulative SOD) of an integer n, is defined as below:

Given the value of n, your job is to find the value of CSOD(n).

Input

Input starts with an integer T (≤ 1000), denoting the number of test cases.

Each case contains an integer n (0 ≤ n ≤ 2 * 109).

Output

For each case, print the case number and the result. You may assume that each output will fit into a 64 bit signed integer.

Sample Input

Output for Sample Input


3

2

100

200000000


Case 1: 0

Case 2: 3150

Case 3: 12898681201837053

题意:求1-n(n<=2e9)之间每个数的SOD之和,定义SOD(x)为x除去1和自己以外的所有因数之和

题解:首先考虑O(n)做法

对于数i,在1-n的因子中出现的次数为(n/i)-1

所产生的贡献是[(n/i)-1]*i

这样得到了O(n)的算法

    for (int i=2; i<=n; ++i)
    {
        sum+=(n/i-1)*i;
    }

但是数据的范围是2e9显然是会TLE的

我们考虑优化,如果你做过一些莫比乌斯反演的题目,你会下意识地发现:当i非常大的时候,因子出现次数很久才会变化一次,比如说(n/3+1)~n/2之间可能有几万个数但是他们都只出现了一次,这种情况就可以使用整除分块来优化

这些数是连续的,他们出现的次数又相同,sum=i*time+(i+1)*time+....+(i+k)*time 发现了吗?这就是个等差数列,可以直接用等差数列求和公式搞。但是这个东西直接将次数从出现一次枚举到出现n次复杂度还是O(n)的

怎么办呢?思考一下对于出现1-sqrt(n)次的数字我们进行第二种操作,那么出现sqrt(n)+1次的数字有几个?只有n/[sqrt(n)+1]左右个了,对于这sqrt(n)个数字,我们可以直接用第一种方法暴力搞

总的复杂度是O(sqrt(n))的

代码如下:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n,pos,next,lim;
long long ans;

int main()
{
    int t,ttt=0;
    scanf("%d",&t);
    while(t--)
    {
        ans=0ll;
        ttt++;
        scanf("%d",&n);
        lim=sqrt(n);
        pos=n/2;
        for(int i=2; i<=lim; i++)
        {
            next=n/(i+1);
            ans+=1ll*(pos-next)*(pos+next+1)*(i-1)/2;
            pos=next;
        }
        for(int i=2; i<=pos; i++)
        {
            ans+=1ll*i*(n/i-1);
        }
        printf("Case %d: %lld\n",ttt,ans);
    }
}

这题还是非常高妙的啊~

原文地址:https://www.cnblogs.com/stxy-ferryman/p/9291296.html

时间: 2024-10-06 08:40:01

LightOJ 1098(均值不等式,整除分块玄学优化)的相关文章

数论分块之整除分块

前言 最近在学莫比乌斯反演,然而只看懂了莫比乌斯函数,然后反演看着一脸懵逼,最后只看懂了数论分块里面的一个分支内容(也是莫比乌斯反演的前置姿势),整除分块 于是写一篇博文记录一下整除分块 整除分块 整除分块是用于快速处理形似 \[ \sum_{i=1}^{n}{\lfloor \frac{n}{i} \rfloor} \] 的式子的方法 很显然,这个可以\(O(n)\)得到答案.但是,在某些题目中,毒瘤出题人将数据加强到了\(10^{10}\)以上,这个时候我们就无法通过\(O(n)\)的解法来

[科技]$Miller\_Rabin$ 和 $Pollard\_Rho$ 及各种玄学优化

[科技]\(Miller\_Rabin\) 和 \(Pollard\_Rho\) 及各种玄学优化 [科技] \(Miller\_Rabin\) 和 \(Pollard\_Rho\) 先讲\(Miller\_Rabin\)吧,\(Miller\_Rabin\)是用来检验素数的高效算法. 我们先要知道两个定理: 费马小定理:当\(p\)为质数时,\(x^{p - 1} \equiv 1 \ \ (mod \ \ p)\).但这只是一个充分条件,但不是必要条件.即就算\(x\)和\(p\)互质,那么\

浅谈均值不等式

定义 其中 ,被称为调和平均数 ,被称为几何平均数 ,被称为算术平均数 ,被称为平方平均数 且 证明 引理1 若,则,当且仅当时取等. 证明: 当时,有,因为,且时取等,所以此时成立. 假设当时成立,则当时有 因为 所以,取等时当且仅当(归纳假设),的值为0,所以取等时当且仅当 所以,定理得证. 定理2 一组数据(所有数非负)的几何平均数小于等于它的算术平均数,即,取等时当且仅当所有数相等. 证明:当时,要证,就要证,因为,所以此时成立. 假设当时成立,则当时,设是最大的一个,所以,另外设,则

均值不等式的常见使用技巧【初级、中级和高阶辅导】

常见的均值不等式的使用技巧 均值不等式这一素材,是高中数学中少见的几个需要同时验证成立的多条件素材.由于要多头验证,所以学生很不习惯,感觉很难掌握. 已知两个正数\(a,b\),则有(当且仅当\(a=b\)时取到等号),高考中重点考查这一部分:$ a+b\ge2\sqrt{ab}(a,b>0)$ 均值不等式的使用 前提条件: 正.定.等同时成立. 均值不等式中还有一个需要注意的地方:\(a,b\in R\) 如已知向量的内积\(\vec{a}\cdot\vec{b}=1,\)则有人这样做\(\v

均值不等式的来龙去脉

均值不等式的来龙去脉 一.为什么叫均值不等式? 来自百度百科的说明,表达式\(H_n\leq G_n\leq A_n\leq Q_n\)被称为均值不等式,即调和平均数不超过几何平均数,几何平均数不超过算术平均数,算术平均数不超过平方平均数,简记为"调几算方". 已知对于\(n\)个实数\(x_1,x_2,\cdots,x_n\)而言, \(H_n=\cfrac{n}{\sum\limits_{k=1}^n{\cfrac{1}{x_k}}}=\cfrac{n}{\cfrac{1}{x_1

均值不等式习题

\(\fbox{例1}\)均值不等式中有一类常考题型,比如,求限定条件下的最值问题,对应的解决方法是:常数代换,乘常数再除常数. [模型1]:已知\(2m+3n=2,m>0,n>0\),求\(\cfrac{4}{m}+\cfrac{1}{n}\)的最小值.(给定条件是整式,求分式的最值,常数代换,乘常数再除常数,部分使用均值不等式) 分析如下:\(\cfrac{4}{m}+\cfrac{1}{n}=\cfrac{1}{2}\cdot (2m+3n)(\cfrac{4}{m}+\cfrac{1}

luogu2261余数求和题解--整除分块

题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\times\) \(i\),于是我们只需要求\(N * k-\sum_{i=1}^N {\lfloor {k/i}\rfloor\times i}\) 这里就需要数论分块,也称作整除分块的知识 结论: \(\forall{i} \in [x,\lfloor {k/{\lfloor {k/x}\rfl

[Bzoj 2956] 模积和 (整除分块)

整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数列求和或对于积性函数的筛法等,然后就可以用整除分块的思想做. 题目解法 化公式变成比较方便的形式: \(\ \sum_{i = 1}^n \sum_{j = 1}^m (n \mod i)(m \mod j), i \ne j\) \(= \sum_{i = 1}^n \sum_{j = 1}^m

UVALive - 3521 Joseph&#39;s Problem (整除分块)

给定$n,k$$(1\leqslant n,k\leqslant 10^9)$,计算$\sum\limits _{i=1}^nk\: mod\:i$ 通过观察易发现$k\%i=k-\left \lfloor \frac{k}{i} \right \rfloor*i$,因此我们考虑把$\left \lfloor \frac{k}{i} \right \rfloor$的值相同的$i$分成一组直接求和,复杂度为$O(\sqrt{n})$. 整除分块原理(选自某dalao博客) 1 #include<b