数论专题hdu2582

Posted mtl6906

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论专题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。

以上是关于数论专题hdu2582的主要内容,如果未能解决你的问题,请参考以下文章

数论专题hdu2197

数论专题hdu2104

数论专题hdu2669

数论专题poj1061

UESTC 电子科大专题训练 数论 E

专题学习——数论(未完待续)