数论专题hdu2582

 

   本题题意:给出公式f(n) = gcd(3) + ... + gcd(n),而gcd(n) = gcd(C(1,n),...,C(n-1,n)),求出f(n)的值。

   代码如下:

   

#include <iostream>
using namespace std;
typedef long long ll;
const int Max = 1000000;
int prime[Max+1];
ll sum[Max+1];
void Prime(){

    int t = 2;
    
    ll i;

    while(t <= Max){

        for(i=t;i<=Max;i+=t){prime[i] = 1;}

        for(i=t;i<=Max;i*=t){prime[i] = t;}

        for(i=t;i<=Max;i++){

            if(prime[i] == 0){

                t = i;

                break;

            }

        }

        if(i == Max+1){

            break;

        }

    }

}


void Sum()
{

    sum[3] = 3;

    for(int i=4;i<=Max;i++){

        sum[i] = sum[i-1] + prime[i];

    }

}
int main()
{

    Prime();
    
    Sum();

    int n;

    while(cin >> n){

        cout << sum[n] << endl;
    
    }    

    return 0;

}

通过打表发现当为p^k形式时(p为素数),gcd(n) = p,否则 gcd(n) = 1,然后就筛下素数,计算下和,结果就出来了。

不过需要注意的是不用long long会flow。

posted @ 2017-09-16 02:54  mtl6906  阅读(106)  评论(0编辑  收藏  举报