码迷,mamicode.com
首页 > 其他好文 > 详细

数论专题hdu2582

时间:2017-09-16 11:37:50      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:using   clu   style   ges   i++   str   ++   sum   ==   

 技术分享

   本题题意:给出公式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

标签:using   clu   style   ges   i++   str   ++   sum   ==   

原文地址:http://www.cnblogs.com/mtl6906/p/7529820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!