天天看點

P2424 約數和 【整除分塊】

一、題目

  P2424 約數和

二、分析

  因為都是加法,那麼肯定有的一個性質,即字首和的思想,就是$$ { ans =\sum_{i=1}^y f(i)} - {\sum_{i=1}^x f(i)}  $$

  基于上面的性質,分析$ \sum_{i=1}^x f(i) $,因為每個數都是因子之和,那麼$1 \to n $ 中一共也就 $n$個因子,其實就将問題轉化到了求每個因子的貢獻上面。

  考慮每個因子最終加  $ \lfloor \frac{n}{i} \rfloor $ 次,是以最終$$ { ans = \sum_{i=1}^y i \lfloor \frac{y}{i} \rfloor} - {\sum_{i=1}^x \lfloor \frac{x}{i} \rfloor}  $$

  然後結合整除分塊求解即可。

三、AC代碼

1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 ll solve(ll n)
 7 {
 8     ll ans = 0;
 9     ll L, R;
10     for(L = 1; L <= n; L = R + 1)
11     {
12         ll res = n/L;
13         if(res)
14         {
15             R = n/res;
16         }
17         else
18             R = n;
19         ans += res * (R - L + 1) * (R + L) / 2;
20     }
21     return ans;
22 }
23 
24 int main()
25 {
26     //freopen("input.txt", "r", stdin);
27     ll x, y;
28     while(scanf("%lld%lld", &x, &y) != EOF)
29     {
30         printf("%lld\n", solve(y) - solve(x - 1));
31     }
32     return 0;
33 }      

轉載于:https://www.cnblogs.com/dybala21/p/11233273.html