【洛谷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;
}
posted @ 2020-10-29 16:37  stoorz  阅读(71)  评论(0编辑  收藏  举报