zoukankan      html  css  js  c++  java
  • 月月给华华出题

     链接: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
    ",f[i]+1);
        }
    }
     
  • 相关阅读:
    sublime text
    php 实例说明 socket通信机制
    nusaop 关于webService
    vim操作集合
    gitHud设置公钥
    redis在window安装并启动
    百度云api 添加标注
    微信小程序bindTap获取对应值
    Java导出excel表
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/lipu123/p/14347453.html
Copyright © 2011-2022 走看看