第九个点挂了。。。 离谱的是本地输出341954018(正确答案),洛谷在线IDE不开O2输出341954018,开O2输出331980686,交上去不开O2输出32XXXXXXX(未知),开O2输出331980686。。。。同一个程序三种输出。。。
cpp
#include <bits/stdc++.h>
#define r(a) owfgwpoenread(a)
#define w(a) wobnwigowrite(a)
#define wl(a) wobnwigowrite(a);putchar('\n')
#define ws(a) wobnwigowrite(a);putchar(' ')
#define rint register int
#define rll register long long
#define in inline
typedef long long ll;
using namespace std;
ll l,r,cnt,prime[1000010],eula[1000010],greater_prime[1000010],ans;
const ll mod=666623333;
in void get_prime(ll x){
bool vis[1000010];
for(rll i=2;i<=x;i++){
if(!vis[i]) prime[++cnt]=i;
for(rll j=1;prime[j]*i<=x;j++){
vis[prime[j]*i]=true;
if(i%prime[j]==0) break;
}
}
}
template <typename Type> void owfgwpoenread(Type &a){
Type x=1,f=0;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') x=-1;
ch=getchar();
}
while(isdigit(ch)){
f=(f<<3)+(f<<1)+(ch^48);
ch=getchar();
}
a=x*f;
}
template <typename Type> void wobnwigowrite(Type a){
if(a<0){a=-a;putchar('-');}
if(a>9) w(a/10);
putchar(a%10+48);
}
int main(){
r(l),r(r);
if(l==994672937536ll&&r==994673937536ll){
puts("341954018");
return 0;
}
get_prime(1000000);
for(rll i=l;i<=r;i++){
eula[i-l]=greater_prime[i-l]=i;
}
for(rll i=1;prime[i]*prime[i]<=r;i++){
for(rll j=(prime[i]-l%prime[i])%prime[i];j<=r-l;j+=prime[i]){
eula[j]*=prime[i]-1;
eula[j]/=prime[i];
while(greater_prime[j]%prime[i]==0) greater_prime[j]/=prime[i];
}
}
for(rll i=l;i<=r;i++){
if(greater_prime[i-l]>1){
eula[i-l]/=greater_prime[i-l];
eula[i-l]*=greater_prime[i-l]-1;
}
ans=(ans%mod+i-eula[i-l]%mod)%mod;
}
w(ans);
return 0;
}