【洛谷P3708】koishi的數學題
阿新 • • 發佈:2020-10-29
題目
題目連結:https://www.luogu.com.cn/problem/P3708
Koishi 在 Flandre 的指導下成為了一名數學大師,她想了一道簡單的數學題。
輸入一個整數 \(n\),設 \(\displaystyle f(x) = \sum_{i=1}^n x \bmod i\),你需要輸出 \(f(1), f(2), \ldots , f(n)\)。
按照套路,Koishi 假裝自己並不會做這道題,就來求你幫忙辣。
思路
考慮每一個 \(i\) 作為模數的貢獻。發現它對 \(f\) 造成的貢獻是
\[0,1,2,···,i-2,i-1,0,1,2,···i-2,i-1,··· \]也就是對於區間 \([ki,(k+1)i)\) 是分別貢獻了 \(1\sim i-1\),設 \(f\) 一開始全部是 \(1\),可以列舉 \(i\) 的每一個倍數,在 \(i\) 倍數位置減去 \(i\),然後做一遍字首和就是 \(f\) 了。
對於每一個 \(i\) 跑一遍,時間複雜度 \(O(n\log n)\)。
思路
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1000010; ll n,f[N]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=i;j<=n;j+=i) f[j]-=i; for (int i=1;i<=n;i++) { f[i]+=f[i-1]+n; printf("%lld ",f[i]); } return 0; }