LightOJ 1375 LCM Extreme(最小公倍数和)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1375

题意:给出n。求allPairLcm函数的返回值。

LightOJ 1375 LCM Extreme(最小公倍数和)

思路:

LightOJ 1375 LCM Extreme(最小公倍数和)

 

其中,这一步

LightOJ 1375 LCM Extreme(最小公倍数和)

的原因是,每个小于x的数中与x互质的数字之和等于phi[x]/2*x,因为它们是成对出现的,且每对之和为x,比如x=12,那么与x互质的数字为1,5,7,11,其中1+11=5+7=12。
 
   
#include <iostream>

#include <cstdio>

#define i64 unsigned long long

using namespace std;





int C,num=0;





const int MAX=3000005;

i64 f[MAX],s2[MAX];



void init()

{

    i64 i,j,p=1;

    f[1]=1;

    for(i=2;i<MAX;i++) if(!f[i]) for(j=i;j<MAX;j+=i)

    {

        if(!f[j]) f[j]=j;

        f[j]=f[j]/i*(i-1);

    }

    for(i=2;i<MAX;i++) for(j=i;j<MAX;j+=i) s2[j]+=i*f[i];

    for(i=1;i<MAX;i++) 

    {

        if(s2[i]%2==0) f[i]=i*(1+s2[i]/2);

        else f[i]=i+i/2*s2[i];

    }

    for(i=1;i<MAX;i++) s2[i]=s2[i-1]+f[i]-i;

}



int n;



int main()

{

    init();

    for(scanf("%d",&C);C--;)

    {

        scanf("%d",&n);

        printf("Case %d: %llu\n",++num,s2[n]);

    }

    return 0;

}

 

 
   

  

 
  

你可能感兴趣的:(ext)