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 ",ans ); } //printf("%lld ",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); } } }