您的位置:首页 > 其它

【容斥原理】HDU 4135

2012-02-28 21:16 162 查看
容斥原理的应用,分别找1~a的和1~b的个数,相减就是答案,其中找的时候要用容斥原理求,因为有些会重复计数

#define N 1000005
int p
;
int cnt;
void factor(int n){
int i;
int a = 1;
for(i=2;i*i<=n;i+=a,a=2){
if(n%i==0){
p[cnt++] = i;
while(n%i==0){
n/=i;
}
}
}
if(n>1)p[cnt++] = n;
}
LL cal(LL n){
int i,j;
LL res = 0;
for(i=0;i<(1<<cnt);i++){//二进制压缩状态,因为n<=1e9,所以素数只有10个左右,0代表不取,1表示取
LL mul = 1;
int k=0;
int tmp = i;
for(j=0;j<cnt;j++){
if(tmp & 1){
k++;
mul *= p[j];
}
tmp>>=1;
}
if(k&1){//容斥原理,奇数个要加
res += n/mul;
} else if(k>0){//偶数个的时候要减,注意k>0
res -= n/mul;
}
}
return n-res;
}
LL gao(LL a,LL b,int n){
factor(n);
return cal(b) - cal(a-1);
}
int main(){
int t;
scanf("%d",&t);
int ca=1;
while(t--){
LL a,b;
int n;
scanf("%I64d%I64d%d",&a,&b,&n);
cnt=0;
LL ans = gao(a,b,n);
printf("Case #%d: %I64d\n",ca++,ans);
}
return  0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: