【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; }