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

HDU 3641 Treasure Hunting

时间:2014-07-29 15:05:18      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:style   io   for   amp   type   size   algorithm   hdu   

用二分查找来找到一个X使得满足X!%M==0

M=a1^b1*a2^b2*a3^b3…*an^bn

X!=1*2*3*4*5....*X;

M可以化为其个个质因子的k次方的乘积

例如 2^3*3^2*4^5==2^13*3^2;

X!则可以得到 

  例如 2的次方为 X! = 2^(X/2)*(1*2*3*4*5*6*7....*X/2)*other=(x/2)! *other;

继续计算知道x/2==1为止 得到次方数;再与输入的数比较

输入的ai,bi 计算并储存好个个质数的次方


#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <limits.h>
#include<algorithm>
#include<math.h>
#include<queue>
typedef __int64 LL;
using namespace std;
LL num[101];
LL out(LL  x,int n)
{
    LL  sum=0;
    while(x){
        sum+=x/n;
        x/=n;
    }
    return sum;
}
bool find(LL x)
{
    for(LL i=2;i<=100;i++)
    {
        if(num[i]>0)
        {
            if(out(x,i)<num[i])//若出现小于
                return false;
        }
    }
    return true;
}
int main()
{
    int n,t;
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);
    while(t--)
    {
        memset(num,0,sizeof(num));
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            int a;
            LL b;
            scanf("%d%I64d",&a,&b);
            while(a!=1)
                for(int i=2;i<=a;i++)//计算素数因子的次方数
                    if(a%i==0)
                    {
                        num[i]+=b;
                        a/=i;
                        break;
                    }
        }
        LL l=0,r;
        r=(LL)1 << 63-1;
        while(l<=r)//二分x
        {
            LL mid=(l+r)>>1;
            if(find(mid))
               r=mid+1;
            else l=mid-1;
        }
        printf("%I64d\n",l);
    }
    return 0;
}

HDU 3641 Treasure Hunting,布布扣,bubuko.com

HDU 3641 Treasure Hunting

标签:style   io   for   amp   type   size   algorithm   hdu   

原文地址:http://blog.csdn.net/kewowlo/article/details/38231877

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