数论专题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。

转载于:https://www.cnblogs.com/mtl6906/p/7529820.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值