HDU 3641 Treasure Hunting

来源:互联网 发布:unity3d人物走动动画 编辑:程序博客网 时间:2024/04/28 18:16

题意:给出ai bi(i=1->n),M = a1^b1 * … * ai^bi * … * an^bn,求一个最小的整数x,使x! % M == 0.


#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include <algorithm>#define M 1#define N#define inf 100000000using namespace std;long long pri[100];int prime[100],top=0;bool f;void prime1(long long a,long long b){    for(int i=0; i<top&&a!=1; i++)    {        if(a%prime[i]==0)        {            f=0;            pri[prime[i]]+=b;            a/=prime[i];            --i;        }    }}int isprime(int a){    int m=sqrt(a);    for(int i=2;i<=m;i++)    {        if(a%i==0)        return 0;    }    return 1;}int main(){//    freopen("ex.in","r",stdin);    int t,n;    long long a,b;    scanf("%d",&t);    for(int i=2;i<98;i++)    if(isprime(i))    prime[top++]=i;    while(t--)    {        f=1;        memset(pri,0,sizeof(pri));        scanf("%d",&n);        for(int i=0; i<n; i++)        {            scanf("%I64d%I64d",&a,&b);            prime1(a,b);        }        if(f)        {            cout<<"0\n";            continue;        }        long long l=1,r=0xfffffffffffffffLL,mid,c,temp;        int flag;        while(l<r)//二分真的很快!!!!!        {            mid=(l+r)>>1;            flag=1;            for(int i=0;i<top;i++)            if(pri[prime[i]])            {                c=0;                temp=mid;                while(temp>=prime[i])                {                    c+=(temp/prime[i]);                    temp/=prime[i];                }                if(c<pri[prime[i]])                {                    l=mid+1;                    flag=0;                    break;                }            }            if(flag)            r=mid;        }        cout<<l<<endl;    }    return 0;}//while(scanf("%d",&n))//    {//        memset(pri,0,sizeof(pri));//        prime(n,1);//        for(int i=1;i<=n;i++)//        cout<<pri[i]<<" ";//        cout<<endl;//    }