HDU 2582 f(n) 素因子

Problem Description

This time I need you to calculate the f(n) . (3<=n<=1000000)

f(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n).
Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1])
C[n][k] means the number of way to choose k things from n some things.
gcd(a,b) means the greatest common divisor of a and b.

Input

There are several test case. For each test case:One integer n(3<=n<=1000000). The end of the in put file is EOF.

Output

For each test case:
The output consists of one line with one integer f(n).

Sample Input

 

3

26983

Sample Output

 

3

37556486

代码及注释如下:

/*
Gcd(3)=3;
Gcd(4)=2;
Gcd(5)=5;
Gcd(6)=1;
Gcd(7)=7;
Gcd(8)=2;
Gcd(9)=3;
Gcd(10)=1;
这道题的规律如下:
1.如果为x素数,则Gcd(x)=x;
2.如果素因子只有一个则Gcd(x)=素因子
3.如果有多个素因子,则Gcd(x)=1;
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
const int maxn=1000005;
int n;
int isnot[maxn];
vector<int> pri;
long long int sum[maxn];
void init()
{
    memset (isnot,0,sizeof(isnot));
    memset (sum,0,sizeof(sum));
}
void Judge ()
{
     for (int i=2;i<=maxn-5;i++)
     {
         if(!isnot[i])
         {
             pri.push_back(i);
             for (int j=i*2;j<=maxn-5;j+=i)
            {
                 isnot[j]=1;
            }
         }
     }
}
int Pnum (int x)
{
    int num=0,p;
    for (int i=0;pri[i]*pri[i]<=x;i++)
    {
        if(x%pri[i]==0)
        {
            num++;
            if(num>1)
                return 1;
            p=pri[i];
            while (x%pri[i]==0)
            {
                x/=pri[i];
            }
        }
    }
    if(x!=1)
    {
        num++;
        x=n;
    }
   if(num>1)
      return 1;
   else
      return p;
}
int main()
{
    init();
    Judge();
    sum[3]=3;
    for (int i=4;i<=maxn-5;i++)
    {
        if(!isnot[i])
            sum[i]=sum[i-1]+i;
        else
            sum[i]=sum[i-1]+Pnum(i);
    }
    while (scanf("%d",&n)!=EOF)
    {
        printf("%lld\n",sum[n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/82950945