一个区间范围内于某些数互质的有多少个
//递归写法
LL sum;
void dfs(int i,int nu,int x,int mu,LL b){
//printf("%d %d %d %d %lld\n",i,nu,x,mu,b);
if(nu==x){
sum+=b/mu;
return;
}
if(i==tmpCnt) return;
dfs(i+1,nu+1,x,mu*tmpPrime[i],b);
dfs(i+1,nu,x,mu,b);
}
LL rong(LL x){
LL s=0;
for(int i=1;i<=tmpCnt;++i){
sum=0;
dfs(0,0,i,1,x);
//printf("rong%d %lld\n",i,sum);
if(i&1)
s+=sum;
else
s-=sum;
}
//printf("%lld\n",s);
return x-s;
}
//迭代写法
int rong(int n,int x)
{
int facn=enlur(x);
int ans=0;
for(int i=1;i<(1<<facn);++i)
{
int cnt=0,tmp=1;
for(int j=0;j<facn;++j)
{
if(i&(1<<j))
{
++cnt;
tmp*=factor[j];
}
}
if(cnt&1) ans+=n/tmp;
else ans-=n/tmp;
}
return n-ans;
}
O(n^2),n为质数的个数。
相关题目: