zoukankan      html  css  js  c++  java
  • hdu 2654(欧拉函数)

    Become A Hero

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 210    Accepted Submission(s): 57


    Problem Description
    Lemon wants to be a hero since he was a child. Recently he is reading a book called “Where Is Hero From” written by ZTY. After reading the book, Lemon sends a letter to ZTY. Soon he recieves a reply.

    Dear Lemon,
    It is my way of success. Please caculate the algorithm, and secret is behind the answer. The algorithm follows:
    Int Answer(Int n)
    {
    .......Count = 0;
    .......For (I = 1; I <= n; I++)
    .......{
    ..............If (LCM(I, n) < n * I)
    ....................Count++;
    .......}
    .......Return Count;
    }
    The LCM(m, n) is the lowest common multiple of m and n.
    It is easy for you, isn’t it.
    Please hurry up!
    ZTY

    What a good chance to be a hero. Lemon can not wait any longer. Please help Lemon get the answer as soon as possible.
     
    Input
    First line contains an integer T(1 <= T <= 1000000) indicates the number of test case. Then T line follows, each line contains an integer n (1 <= n <= 2000000).
     
    Output
    For each data print one line, the Answer(n).
     
    Sample Input
    1 1
     
    Sample Output
    0
     
    LCM(a,b)=a*b/gcd(a,b) 如果 要LCM(a,b) < a*b 那么gcd(a,b)不能为1,所以题目就转换成了 1-n 内与n不互质的数有多少个了。利用欧拉函数求出互质的个数,减掉就是答案。
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    #include <math.h>
    using namespace std;
    typedef long long LL;
    const int N = 2000005;
    int euler[N];
    void getEuler()
    {
        memset(euler,0,sizeof(euler));
        euler[1] = 1;
        for(int i = 2; i <= N; i++){
            if(!euler[i])
                for(int j = i; j <= N; j+= i)
                {
                    if(!euler[j])
                        euler[j] = j;
                    euler[j] = euler[j]/i*(i-1);
                }
        }
    }
    
    int main()
    {
        getEuler();
        int tcase;
        scanf("%d",&tcase);
        while(tcase--){
            int n;
            scanf("%d",&n);
            printf("%d
    ",n-euler[n]);
        }
        return 0;
    }
  • 相关阅读:
    opencv学习笔记(五)镜像对称
    opencv学习笔记(四)投影
    C++文件读写详解(ofstream,ifstream,fstream)
    C++ 提取字符串中的数字
    opencv学习笔记(三)基本数据类型
    opencv学习笔记(二)寻找轮廓
    分别心
    关于bonecp和QuerRunner
    关于AutoCommit
    一个detect问题引发的一系列思考
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5532256.html
Copyright © 2011-2022 走看看