原题链接
Problem Description
The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose you are given a, b, try to calculate (a)+ (a+1)+…+ (b)
Input
There are several test cases. Each line has two integers a, b (2<a<b<3000000).
Output
Output the result of (a)+ (a+1)+…+ (b)
Sample Input
3 100
Sample Output
3042
题意分析:求a到b之间所有的欧拉函数值的和
相当于一个模版题,先筛出1-maxn的所有欧拉函数的值即可,文末有线性的欧拉筛,更快
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=3e6+7;
const int mod=1e9+7;
ll p[maxn];
//o(nloglogn)的筛法
void get_Phi()
{
for(int i=2;i<=maxn;i++)p[i]=0;
p[1]=1;
for(int i=2;i<=maxn;i++)
if(!p[i]){
for(int j=i;j<=maxn;j+=i){
if(!p[j])p[j]=j;
p[j]=p[j]/i*(i-1);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
get_Phi();
int a,b;
while(scanf("%d%d",&a,&b)!=-1)
{
ll ans=0;
for(int i=a;i<=b;i++)
ans+=p[i];
printf("%lld\n",ans );
}
//printf("%lld\n",ans );
return 0;
}
const int N=3e6+7;
int prime[N],isprime[N];//记录素数的
int phi[N];
void get_phi(){
int i,j,cnt=0;
for (i=2; i<=N; i++) {
if (isprime[i]==0){
prime[cnt++]=i;
phi[i]=i-1;
}
for (j=0; j<cnt&&i*prime[j]<N; j++) {
isprime[i*prime[j]]=1;
if (i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}