hdu 2654 Be a hero

()Become A Hero

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


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(i,n)<i*n条件的 i 的个数
因为lum(i,n)=(i*n)/gcd(i,n);
所以     lcm(i,n)<i*n   <<===>>gcd(i,n)>1
即求i<n中 i, n不互质的个数
(不互质的个数=n-φ(n))
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll euler(ll x)
{
    ll res = x;
    for(int i=2 ;i*i<=x ;i++)
    {
        if(x%i == 0)
        {
            res = res/i*(i-1);
            while(x%i==0) 
              x/=i;
        }
    }
    if(x>1) 
      res = res/x*(x-1);
    return res;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n;
        scanf("%I64d",&n);
        printf("%I64d
",n-euler(n));
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/-citywall123/p/10171035.html