只有一行乙個整數 n(0 < n < 1000000)。
只有一行輸出,為整數m,即f(1)到f(n)的累加和。
答案即為1..x1..x的所有約數個數和。
我們知道換種形式答案就是∑i⌊ni⌋∑i⌊ni⌋。
那麼暴力演算法來了:所以我們
for (int i=1; i<=n; i++)
ans += n/i;
就好了。
由於n=1e6,所以這個o(n)的演算法是能夠過去的。但是不行!這個是數論分塊的板子題,我們怎麼能夠止步於o(n)的演算法呢?
若用g(i)表示n/i,顯然
自然而然地想到,在求g(i)的同時能不能夠求出[i,j]呢?
這裡有乙個結論,
我們有
故jj是滿足條件的最大值。
我們要做的就是列舉可能的下整值,並合併計算。
#includetypedef long long ll;
int n;
ll ans;
int main()
[cqoi2007]餘數求和
來自大佬的證明
#include#include#include#define ll long long
using namespace std;
int main()
cout求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。
第一行兩個數n,m。
乙個整數表示答案mod 19940417的值
3 41
樣例說明
答案為(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod 2) * (4 mod 3) + (3 mod 2) * (4 mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4) = 1資料規模和約定
對於100%的資料n,m<=10^9。
ll sum(ll n)// n*(n+1)*(2*n+1)/6 完全平方數 求和公式
ll solve(ll m,ll n)
return res;
}int main()
cout<
}
數論分塊入門
目錄通常用來解決 sum n lfloor frac rfloor 這種問題。我們代入 n 10。i1 2345 6789 10 lfloor frac rfloor 105 3221 1111 可以看到後面有連續的 i lfloor frac rfloor 相同。呈現塊狀分布 每個塊的起點 l 和...
數論 數論分塊
求解圖中紅點和綠點的總數之和。求 sum k space mod space i 如果縱軸的x乙個點乙個點進行移動的話,將會非常緩慢。k i k fraci times i 於是有 sum k space mod space i sum k fraci times i n times k sum i...
分塊入門題
分塊入門題5 給 l,r 取開方,乙個數字最多被取開方6次,那麼乙個塊內有需要開方的時候才對這個塊取開方,那麼最多6 n sqrt n 次,分塊直接寫 includeusing namespace std typedef long long ll const int maxn 1e5 7 int l...