zoukankan      html  css  js  c++  java
  • 【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;
        
    }
  • 相关阅读:
    wp8 入门到精通 测量代码执行时间
    过滤器——Filter
    hisui培训笔记
    监听器——servlet
    easyui导出excel表格和遇到的问题
    Java自定义注解
    Json
    Ajax
    探索Java中new一个对象时发生了什么
    SpringBoot常用注解
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196357.html
Copyright © 2011-2022 走看看