【AHOI 2005】 约数研究

【题目链接】

           点击打开链接

【算法】

          要求M,显然可以通过约数个数定理从1..N暴力计算答案,然而n最大10^6,这个算法的时间复杂度是

         O(N * sqrt(N))的,不能通过此题

         因此我们换一种思路

         不妨考虑每个数对答案的“贡献”,若这个数为i,那么1..n中,共有n / i个数是i的倍数,那么i对答案的“贡献”

         就是n / i,因此答案应该是 sigma(n / i) (1 <= i <= n)

【代码】

          

#include<bits/stdc++.h>
using namespace std;

long long i,n,ans = 0;

template <typename T> inline void read(T &x) {
        long long f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;
}

template <typename T> inline void write(T x) {
    if (x < 0) { putchar('-'); x = -x; }
    if (x > 9) write(x/10);
    putchar(x%10+'0');
}

template <typename T> inline void writeln(T x) {
    write(x);
    puts("");
}

int main() {
        
        read(n);
        for (i = 1; i <= n; i++) ans += n / i;
        writeln(ans);
        
        return 0;
    
}

 

posted @ 2018-04-30 20:40  evenbao  阅读(152)  评论(0编辑  收藏  举报