HDU  1695  GCD

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=100000+5;
int a,b,c,d,k;
bool isprime[maxn];
int prime[maxn];
int cnt=0;
long long phi[maxn];

struct Num {
    int factor[30];
    int idx;
} num[maxn];

void init() {
    memset(isprime,true,sizeof(isprime));
    for(int i=2; i<maxn; i++) {
        if(isprime[i]) {
            prime[cnt++]=i;
            for(int j=2*i; j<maxn; j+=i)
                isprime[j]=false;
        }
    }
    for(int i=1; i<maxn; i++) {
        phi[i]=i;
        num[i].idx=0;
    }
    num[1].factor[num[1].idx++]=1;
    for(int i=2; i<maxn; i++) {
        if(isprime[i]) {
            for(int j=i; j<maxn; j+=i) {
                phi[j]=phi[j]/i*(i-1);
                num[j].factor[num[j].idx++]=i;
            }
        }
    }
    for(int i=2; i<maxn; i++)
        phi[i]+=phi[i-1];

}
//容斥原理,太奇妙了!
long long rongchi(int n,int m,int idx) {
    long long ret=0,tmp;
    for(int i=idx; i<num[n].idx; i++) {
        tmp=(long long)m/num[n].factor[i];
        ret+=tmp-rongchi(n,tmp,i+1);
    }
    return ret;
}
/*
long long rongchi(int index,int m,int n) {
    //index表示此刻算到n的哪个质因数,m表示在1~b中计算能被某质因数整除的个数,n指[b\k+1,d\k]区间的数。
    long long ans=0,tmp;
    for(int i=index;i<num[n].cnt;i++) { //x与y的最大公约数为k*p(p为质数)
        tmp=m/num[n].prime[i];    //w是n的素因子,则(1,b)中是w倍数的数共有b/w个
        ans+=tmp-rongchi(i+1,tmp,n);  //因为防止有数被重复计算,所以根据容斥定理
    }
    return ans;
}
*/
int main() {
    int t,cases=0;
    init();
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        if(k) {
            //注意k不能为0
            b=b/k;
            d=d/k;
            if(b>d)
                swap(b,d);
            long long ans=phi[b];
            for(int i=b+1; i<=d; i++) {
                ans+=(b-rongchi(i,b,0));
            }
            printf("Case %d: %I64d\n",++cases,ans);
        } else {
            //当k=0的时候,结果为0。。。
            printf("Case %d: 0\n",++cases);
        }
    }
    return 0;
}
View Code

相关文章:

猜你喜欢
  • 2021-10-06
  • 2022-02-07
  • 2021-08-25
  • 2021-10-07
  • 2022-01-24
  • 2022-12-23
  • 2021-07-12
相关资源
相似解决方案