正题
题目链接:https://www.luogu.com.cn/problem/P3708
题目大意
定义f(x)=∑i=1nx%if(x)=\sum_{i=1}^nx\% if(x)=∑i=1nx%i
求每个f(i)f(i)f(i)
解题思路
考虑枚举模数iii,对与每个xxx会产生x%ix\% ix%i的贡献,也就是对与连续的一段是0,1,2,3,...i−10,1,2,3,...i-10,1,2,3,...i−1的贡献,赋值的是一个等差数列所以两边差分即可。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e6+10;
ll n,a[N],b[N];
int main()
{scanf("%lld",&n);for(ll i=2;i<=n;i++){for(ll j=0;j<=n;j+=i)a[j+1]++,a[j+i]--,b[j+i]-=i-1;}for(ll i=1;i<=n;i++)a[i]+=a[i-1];for(ll i=1;i<=n;i++)b[i]+=a[i];for(ll i=1;i<=n;i++)b[i]+=b[i-1];for(ll i=1;i<=n;i++)printf("%lld ",b[i]);
}