11426 - GCD - Extreme (II) 欧拉函数筛

题目:11426 - GCD - Extreme (II)

题意:

             

      题意是不是很清楚了,但是如何求呢,怎么换一种方法理解,题意是不是等同于求i与比i小的所有数的最大公约数,如果转换不明白可以想象成乘法口诀表,然后把所有i的最大公约数相加,一直加到n。

思想:本题的题意是否非常的清楚,那么我们怎么求呢?根据题意,是求所有i与比i小的所有数的最大公约数m,那么我们只要求出所有m,再把m相加,就是最后的结果。那么我们的重点是如何求m。所有i与比i小的所有数的最大公约数m这种求法像不像欧拉函数,欧拉函数是求i之前所有与i互质数的个数,那么如果我们知道与i互质数的个数, 同时根据这个公式gcd(a, b) = 1, gcd(a * t, b *t) = t,是不是就能知道这些数的最大公约数了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL maxn = 4e6+5;
LL pri[maxn], a[maxn];
void Prime()
{
    memset(a,0, sizeof(a));
    for(int i = 1; i <= maxn; i++)
    {
        pri[i] = i;
    }
    for(int i = 2; i <= maxn; i++)
    {
        if(pri[i] == i)
        {
            for(int j = i; j <= maxn; j += i)
            {
                pri[j] = pri[j]/i*(i-1);
            }
        }
        for(int j = 1; j * i <= maxn; j++)
        {
            a[i*j] += j*pri[i];
        }
    }
    for(int i = 1; i <= maxn; i++)
    {
        a[i] += a[i-1];
    }
}
int main()
{
    int n;
    Prime();
    while(cin>>n && n != 0)
    {
        printf("%lld\n", a[n]);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值