/* phi(10)=5/5*(5-1)数k被一个质数p整除:phi(k)=phi(k)/p*(p-1) 这样子我们就把所有小于 sqrt(r) 的质数去掉了但是还有一种情况:比如 2*97 = 194,我们假设97>sqrt(r):phi(194)=194/2*1,此时还需要除去这个大质数的贡献。*/ #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> using namespace std;z #define int long long inline int gi(){ char tmp=getchar();int ans=0; while(!isdigit(tmp)) tmp=getchar(); while(isdigit(tmp)){ ans=ans*10+tmp-'0'; tmp=getchar(); } return ans; } const int Mod = 666623333; const int N = 4000200; int cnt,Prime[402000];bool Vis[8000202]; inline void Pre(){ for(int i=2;i<=5000000;++i){ if(!Vis[i]) Prime[++cnt]=i; for(int j=1;i*Prime[j]<=5000000 && j<=cnt ;++j){ Vis[i*Prime[j]]=1; if(i%Prime[j]==0) break; // 保证每一个数只会被最小的质因子筛去 } } } int Phi[N],Remain[N]; signed main() { int l,r; l=gi(),r=gi(); Pre(); for(int i=l;i<=r;++i) Phi[i-l]=i,Remain[i-l]=i; for(int i=1;Prime[i]*Prime[i]<=r && i<=cnt;++i){ // 枚举素数 int p=Prime[i]; int st=l; if(st%p!=0) st=(l/p)*p+p; for(int j=st;j<=r;j+=p){ // if(j==0) continue; Phi[j-l]=(Phi[j-l]/p)*(p-1); while(Remain[j-l]%p==0) Remain[j-l]/=p; } } int ans=0; for(int i=l;i<=r;++i){ if(Remain[i-l]>1) Phi[i-l]=(Phi[i-l]/Remain[i-l])*(Remain[i-l]-1); ans=(ans+(i-Phi[i-l])%Mod)%Mod; } printf("%lld",ans%Mod); return 0; }