zoukankan      html  css  js  c++  java
  • UVa11426 GCD

    见http://www.cnblogs.com/SilverNebula/p/6280370.html

    II的数据范围是I的20倍。

    但是做I时用的O(n)+O(nlogn)+O(n)的算法足够了。

    没错我就是在水博

    /*by SilverN*/
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int mxn=4000005;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int pri[mxn],cnt=0;
    long long phi[mxn],f[mxn];
    void PHI(){
        for(int i=2;i<mxn;i++){
            if(!phi[i]){
                phi[i]=i-1;
                pri[++cnt]=i;
            }
            for(int j=1;j<=cnt && (long long)i*pri[j]<mxn;j++){
                if(i%pri[j]==0){
                    phi[i*pri[j]]=phi[i]*pri[j];
                    break;
                }
                else phi[i*pri[j]]=phi[i]*(pri[j]-1);
            }
        }
        return;
    }
    int main(){
        PHI();
        int i,j;
        for(i=1;i<mxn;i++){//枚举因数 
            for(j=i*2;j<mxn;j+=i){
                f[j]+=i*phi[j/i];
            }
        }
        for(i=3;i<mxn;i++)f[i]+=f[i-1];
        while(1){
            i=read();
            if(!i)break;
            printf("%lld
    ",f[i]);
        }
        return 0;
    }
  • 相关阅读:
    二叉排序树(B-Tree)-c实现
    队列(Queue)-c实现
    栈(stack)--c实现(使用双链表)
    链表(list)--c实现
    c 和 指针读书笔记(1)
    c traps and pitfalls reading notes(2)
    js 控制
    正则表达式
    Android 笔记
    Android 布局方式学习
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6280378.html
Copyright © 2011-2022 走看看