求助
查看原帖
求助
461616
Judgelight楼主2023/2/24 19:07

WA10pts

#include<bits/stdc++.h>
#define int long long
#define N 1000009
using namespace std;
int n,primes[N],cnt,mu[N],ans,l,r,become[N];
bool st[N];
void init(int n){
	mu[1]=1;
	for(int i=2;i<=n;i++){
		if(!st[i]){
			primes[++cnt]=i;
		}
		for(int j=1;j<=cnt&&primes[j]*i<=n;j++){
			st[primes[j]*i]=1;
			if(i%primes[j]==0){
				break;
			}
		}
	}
}
inline int from(int n,int mod){
	return n%mod==0?n:n+(mod-n%mod);
}
inline int to(int n,int mod){
	return n%mod==0?n:n-n%mod;
}
long long ksc(long long a,long long b,long long m)
{
	return (a*b-(long long)((long double)a/m*b)*m+m)%m;
}
int ksm(int a,int b,int mod){
	if(b==0){
		return 1%mod;
	}
	int now=ksm(a,b/2,mod);
	if(b%2==1){
		return ksc(ksc(now,now,mod),a,mod);
	}
	return ksc(now,now,mod);
}
bool test(int a,int b){
	int b1=b-1,num=0;
	while(b1%2==0){
		b1/=2;
		num++;
	}
	int x1=ksm(a,b1,b),x2;
	for(int i=1;i<=num;i++){
		x2=ksc(x1,2,b);
		if(x2==1&&x1!=1&&x1!=b-1){
			return 0;
		}
		x1=x2;
	}
	if(x1==1){
		return 1;
	}
	return 0;
}
bool miller_rabin(int n){
	if(n<2){
		return 0;
	}
	if(n==2){
		return 1;
	}
	if(n%2==0){
		return 0;
	}
	for(int i=1;i<=10;i++){
		int a=rand()%(n-1)+1;
		if(!test(a,n)){
			return 0;
		}
	}
	return 1;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	init(1000000);
	cin>>l>>r;
	for(int i=l;i<=r;i++){
		become[i-l]=i;
		mu[i-l]=1;
	}
	for(int i=1;i<=cnt;i++){
		int x=primes[i];
		for(int j=from(l,x);j<=to(r,x);j+=x){
			int len=0;
			while(become[j-l]%x==0){
				become[j-l]/=x;
				len++;
			}
			if(len>1){
				mu[j-l]=0;
			}
			else mu[j-l]=-mu[j-l];
		}
	}
	for(int i=l;i<=r;i++){
		if(become[i-l]==1){
			ans+=mu[i-l];
		}
		else{
			if(miller_rabin(become[i-l])){
				ans+=-mu[i-l];
			}
			else{
				int now=sqrt(become[i-l]);
				if(now*now!=become[i-l]){
					ans+=mu[i-l];
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
2023/2/24 19:07
加载中...