做法:直接跑R-L只有10^7,考虑将min(sqrt(R),K)之前的质数筛出来,然后暴力就好了,用一个桶维护L,R中满足的情况。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #define LL long long 2 #include <cstdio> 3 #include <iostream> 4 #include <cstring> 5 #include <cmath> 6 #define N 100000007 7 using namespace std; 8 LL L,R,K,ans; 9 bool zs[N], A[N]; 10 11 LL min(LL a,LL b) {return a<b?a:b;} 12 13 void Pre_work(){ 14 for(int i=2;i<=K;i++){ 15 if(zs[i]) continue; 16 for(int j=2;j<=K/i;j++) zs[i*j]=1; 17 } 18 zs[1]=1; 19 } 20 21 int main(){ 22 freopen("prime.in","r",stdin); 23 freopen("prime.out","w",stdout); 24 cin>>L>>R>>K; 25 K=min(sqrt(R),K); 26 Pre_work(); 27 for(int i=1;i<=K;i++){ 28 if(!zs[i]){ 29 if(L<=i&&i<=R) ans^=i; 30 LL S=L/i; if(i*S<L) S++; 31 LL E=R/i; 32 for(LL j=S;j<=E;j++) 33 A[i*j-L]=1; 34 } 35 } 36 for(LL i=L;i<=R;i++) 37 if(!A[i-L]) ans^=i; 38 cout<<ans; 39 }