考虑f(i)=i%1+i%2+i%3+.....+i%n
f(i+1)=(i+1)%1+(i+1)%2+......+(i+1)%n
其中不是i+1的因数的部分在f(i+1)的地方都加了1. 例如3%3=0,4%3=1;或5%4=1,6%4=2.。
而是i+1的因数的部分……置零了。如2%3=2,3%3=0 。
所以我们在根据f(i)计算f(i+1)时,先把每一位都+1(其实就是总体+n),然后减去所有i+1的因子。
因子和应该用欧拉筛求,因为它是积性函数,然而我不会。 有没有大佬来讲一下……
于是这道题就完了。
#include<cstdio> #include<cctype> long long sum[1000010]; int main(){ sum[1]=1; int n; scanf("%d",&n); for(int i=2;i<=n>>1;++i) for(int j=i*2;j<=n;j+=i) sum[j]+=i; long long ans=n-1; for(int i=1;i<=n;++i){ printf("%lld ",ans); ans+=n-1-sum[i+1]-i-1; } return 0; }