洛谷 P1403 [AHOI2005]約數研究
阿新 • • 發佈:2018-12-10
怎麼會有這麼水的省選題
一定是個簽到題。
好歹它也是個省選題,獨立做出要紀念一下
很容易發現在1~n中,i的因子數是n / i
那就列舉每一個i然後加起來就OK了
#include<cstdio> #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; int main() { int n; scanf("%d", &n); long long ans = 0; _for(i, 1, n) ans += n / i; printf("%lld\n", ans); return 0; }
不過好像還有更快的做法
因為很多n/i答案是一樣的
所以可以把這些都加起來。
下列除法都是下取整
如果 n / i + 1 = n / j
則 j = n / (n / i)
這個結論非常有用!!!!
#include<cstdio> #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; int main() { int n; scanf("%d", &n); long long ans = 0; _for(i, 1, n) { int j = n / (n / i); ans += (j - i + 1) * (n / i); i = j; } printf("%lld\n", ans); return 0; }