题目描述
Koishi在Flandre的指导下成为了一名数学大师,她想了一道简单的数学题。
输入一个整数n,设,你需要输出
。
按照套路,Koishi假装自己并不会做这道题,就来求你帮忙辣。
输入输出格式
输入格式:
一个正整数n。
输出格式:
一行用空格分隔的n个整数。
输入输出样例
输入样例#1:
10
输出样例#1:
9 16 22 25 29 27 29 24 21 13
说明
对于20%的数据,。
对于60%的数据,。
对于100%的数据,。
一定是窝太菜了,月赛时只想出了n^2的做法,就没有写。
下来看zzq的题解,发现根本看不懂,QwQ。
其实真的不难,我们考虑递推:
初始数列0000000000
先都加1,变成
1111111111
发现第一个1其实是0,所以ans-1.
0111111111
再加1,变成
1222222222
前两个数都要被mod掉,所以ans-2-1.
综上,发现f(x)=f(x-1)+n-kΣi=1(x%k==0)
所以只要知道x的所有约数的和即可,筛一遍就好了。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+5;
int n;
long long s[N],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)
s[j]+=i;
for(int i=1;i<=n;i++)
{
ans+=n-s[i];
printf("%lld ",ans);
}
printf("\n");
return 0;
}