码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3388 -Coprime-容斥原理

时间:2015-07-22 16:11:33      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

友情题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3388


#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>

using namespace std;
typedef long long LL;

const int N=1000005;
const LL INF=(LL)1<<62;

bool prime[N];
LL p[N];
LL f[N];
LL k,cnt,num,ans,n,m,K;

void isprime()//判断素数,将素数存在数组p中 
{
    k=0;
    int i,j;
    memset(prime,true,sizeof(prime));
    for(i=2; i<N; i++)
    {
        if(prime[i])
        {
            p[k++]=i;
            for(j=i+i; j<N; j+=i)
            {
                prime[j]=false;
            }
        }
    }
}

void Solve(LL m,LL n)//在已知素数组中求能被m,n整除的素数放在数组f中 
{
    cnt=0;
    LL i;
    for(i=0; p[i]*p[i]<=n; i++)
    {
        if(n%p[i]==0)
        {
            f[cnt++]=p[i];
            while(n%p[i]==0) n/=p[i];
        }
    }
    if(n>1)
        f[cnt++]=n;
    for(i=0; p[i]*p[i]<=m; i++)
    {
        if(m%p[i]==0)
        {
            f[cnt++]=p[i];
            while(m%p[i]==0) m/=p[i];
        }
    }
    if(m>1)
        f[cnt++]=m;
}

void dfs(LL k,LL t,LL s,LL n) //????? 
{
    if(k==num)
    {
        if(t&1) ans-=n/s;
        else    ans+=n/s;
        return;
    }
    dfs(k+1,t,s,n);
    dfs(k+1,t+1,s*f[k],n);
}

LL Binary()  //二分查找 
{
    LL l=1,r=INF,mid,ret;
    while(l<=r)
    {
        mid=(l+r)/2;
        ans=0;
        dfs(0,0,1,mid);
        if(ans>=K)
        {
            ret=mid;
            r=mid-1;
        }
        else
            l=mid+1;
    }
    return ret;
}

int main()
{
    isprime();
    LL t,ct,tt=1;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%I64d%I64d",&m,&n,&K);
        printf("Case %d: ",tt++);
        if(n==1&&m==1)
        {
            printf("%I64d\n",k);
            continue;
        }
        Solve(m,n);
        sort(f,f+cnt);//排序 
        num=1;
        for(LL i=1; i<cnt; i++)//去重 
        {
            if(f[i]!=f[i-1])
            {
                f[num++]=f[i];
            }
        }
        ct=num; //记录下两者的因素数总数 
        printf("%I64d\n",Binary());
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU3388 -Coprime-容斥原理

标签:

原文地址:http://blog.csdn.net/holyang_1013197377/article/details/47003711

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!