HDU 1695 GCD(phi函数+容斥)

Priblem Link

GCD
找出满足 gcd(x,y)=k,x[1,b]y[1,d] 的对数

Analyse

要找到满足 gcd(x,y)=k,x[1,b]y[1,d] 的解,相当于找 gcdx/k,y/k=1 ,也就是说要找到 gcd(x,y)=1,x[1,b/k],y[1,d/k] 的对数,假设 b<d
对于 i[1,d/k] , i<=b 时,与i互素的个数就是, ϕ(i) ,而 i>b 用容斥原理找出 [1,b/k] 里面与i互素的个数就行了。

AC code

#include 
#include
#include
#include

#define Debug(x) cout<<(x)<

using namespace std;
const int MAXN = 1e5+10;

typedef long long LL;

int prime[MAXN];
int factor[MAXN];
LL euler[MAXN];

int primecnt;

void getprime(){
    primecnt=0;
    memset(prime,0,sizeof(prime));
    for(int i=2;iif(!prime[i])
            prime[primecnt++]=i;
        for(int j=0;j1;
            if(i%prime[j] == 0)
                break;
        }
    }
}
//求因子个数
int getfactor(int n)
{
    int factorcnt = 0;
    for(int i=0 ; iif(n%prime[i]==0)
        {
            factor[factorcnt++] = prime[i];
            while(n % prime[i] == 0)n /= prime[i];
        }
    }
    if(n>1)factor[factorcnt++] = n;
    return factorcnt;
}

//与i互素的个数
int uncoprime(int n,int x)
{
    int factorcnt = getfactor(x);
   // Debug(factorcnt);
    int ans = 0;
    for(int i = 1 ; i<(1<int cnt = 0,res = 1;
        for(int j = 0 ; jif(i & (1<if(cnt & 1)ans+=n/res;
        else ans-=n/res;
    }
    //Debug(ans);
    return ans;
}
void phi_table(int n = MAXN)
{
    memset(euler,0,sizeof(euler));
    euler[1] = 1;
    for(int i=2 ; iif(!euler[i])
        {
            for(int j = i ; jif(!euler[j])euler[j] = j;
                euler[j] = euler[j]/i*(i-1);
            }
        }
        euler[i]+=euler[i-1];
    }
}


int main()
{
   //freopen("H:\\c++\\file\\stdin.txt","r",stdin);
   int kase = 0;

   int a,b,c,d,k;
   int T;scanf("%d",&T);
   getprime();
   phi_table();
   while(T--)
   {

       scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);

       if(k>b|k>d || k ==0){
        printf("Case %d: %d\n",++kase,0);continue;
       }
         b/=k;d/=k;
       if(b>d)swap(b,d);
       LL ans = euler[b];
       for(int i= b+1 ; i<=d ; ++i)
       {
           ans  = ans+b-uncoprime(b,i);
       }
       printf("Case %d: ",++kase);
       cout<return 0;
}

你可能感兴趣的:(算法&数据结构)