题意:给出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 100000000
using 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;
// }