JZOJ 1219. Num

Description

JZOJ 1219. Num_第1张图片

Input

输入文件仅包括一行,一个整数 N ( 2N2311 )

Output

输出文件仅包括一行,一个整数,表示 F(n)

Sample Input

4

Sample Output

4

Data Constraint

Hint

对于 40% 的数据, 1N107
对于 60% 的数据, 1N108
对于 100% 的数据, 1N2311

Solution

  • 这题一眼就是一个数论题,只是处理方法有些与众不同

  • 首先来看 60% 的数据: 1N108 O(N) 可以碾过

  • 答案又显然是:

    (i=1nNi)n

  • 即:

    i=2nNi

  • 这样 60 分就解决了。但是 100 分的: 1N2311 又怎么办呢?

  • 观察可知,N 除以 i 下取整后,答案是有许多重复的,即一段一段的

  • 那么把指针对到 N ,之后计算出下一段开头在哪儿,在累加整一段答案

  • 这样打代码超短!可时间如何呢?

  • 由于一个数的约数在数据范围内最多不过 105 个,时间复杂度接近 O((N))

Code

#include
using namespace std;
int n,m,p;
long long ans;
int main()
{
    scanf("%d",&n);
    for(m=n;m>1;m=p)
    {
        int k=n/m;
        p=n/(k+1);
        ans+=k*(m-p);
    }
    printf("%lld",ans);
    return 0;
}

你可能感兴趣的:(数论)