/****************************************************************************
@author LJ 2014-8-13
欧拉函数是求和n互质的数的个数。例如φ(8)=4,因为1,3,5,7均和8互质。
φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
(注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若m,n互质,φ(mn)=φ(m)φ(n) 当n为奇数时,φ(2n)=φ(n)
@author LJ 2014-8-13
欧拉函数是求和n互质的数的个数。例如φ(8)=4,因为1,3,5,7均和8互质。
φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
(注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若m,n互质,φ(mn)=φ(m)φ(n) 当n为奇数时,φ(2n)=φ(n)
*****************************************************************************/
问题描述:给你[a,b],求这段区间内的i的互质数个数的和(即欧拉函数值的和)。
2<a<b<3000000。试了两种方法,第一种,直接暴力求解每个euler值,最后求和。
果断TLE了。第二种方法,预处理3000000内的euler值,结果没爆。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 3000000
using namespace std;
int phi[maxn+1];
void init(){//递推求欧拉函数phi[i]
for(int i=1;i<=maxn;i++)phi[i]=i;
for(int i=2;i<=maxn;i+=2)phi[i]/=2;
for(int i=3;i<=maxn;i+=2)
if(phi[i]==i){
for(int j=i;j<=maxn;j+=i){
phi[j]=phi[j]/i*(i-1);
}
}
}
int euler(int x){//单独直接求欧拉函数
int i,res=x;
for(i=2;i<(int)sqrt(x*1.0)+1;i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0)x/=i;//保证下一个i一定是素数
}
}
if(x>1)res=res/x*(x-1);
rt res;
}
int main(){
#ifdef ACBang
// freopen("in.txt","r",stdin);
#endif
init();
int a,b;
while(~sf("%d%d",&a,&b)){
LL ans=0;
REP(i,a,b)ans+=phi[i];//需预处理
REP(i,a,b)ans+=euler(i);//TLE了
pf("%I64d\n",ans);
}
rt 0;
}
/****************************************************************************
@author LJ 2014-8-13
欧拉函数是求和n互质的数的个数。例如φ(8)=4,因为1,3,5,7均和8互质。
φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
(注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若m,n互质,φ(mn)=φ(m)φ(n) 当n为奇数时,φ(2n)=φ(n)
*****************************************************************************/