月月给华华出题

 链接:https://ac.nowcoder.com/acm/contest/392/D
来源:牛客网

 

输入描述:

一个正整数n。

输出描述:

输出n行,第i行表示N=i时的答案。
示例1

输入

6

输出

1
2
4
6
11
11

备注:

1≤n≤1e6
请注意输出的效率

思路:

最后一步是根据这个欧拉函数的一个得出的:

小于等于n的数中与n互质的数sum和为phi(n) * n/2

phi(x)为欧拉函数

由于题目要求输出1~n的每一个答案,那么我们从1到n枚举i当做上式中因子d来计算对每个答案的贡献即可。

 

 

#include <iostream>
#include<algorithm>
using namespace std; 
typedef long long ll;
const int maxn=3e6+100;
int ol[maxn];
int prime[maxn];
int cnt;
ll f[maxn];
int n;
void inint(){
    ol[1]=1;
    for(int i=2;i<maxn;i++){
        if(!ol[i]){
            prime[++cnt]=i;
            ol[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
            if(i%prime[j]==0){
                ol[i*prime[j]]=ol[i]*prime[j];
                break;
            } 
            else{
                ol[i*prime[j]]=ol[i]*(prime[j]-1);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j+=i){
            f[j]+=1ll*ol[i]*i/2;
        }
    }
}
int main(){
    cin>>n;
    inint();
    for(int i=1;i<=n;i++){
        printf("%lld\n",f[i]+1);
    }
}

 

 
posted @ 2021-01-29 22:39  lipu123  阅读(81)  评论(0编辑  收藏  举报