1. 程式人生 > 實用技巧 >【洛谷P3708】koishi的數學題

【洛谷P3708】koishi的數學題

題目

題目連結: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;
}