Treasure Hunting
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
__int64 max(__int64 a, __int64 b)
{
return a > b ? a : b;
}
int a[25] = {2, 3, 5, 7, 11, 13, 17, 19, 23,
29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73,79, 83, 89, 97};
__int64 num[25];
int total;
void fun(int x, __int64 y)
{
for(int i = 0; i < 25 && x != 1; ++i)
{
while(x % a[i] == 0)
{
x /= a[i];
if(num[i] == 0)
total++;
num[i] += y;
}
}
}
__int64 NumOfX(__int64 n, __int64 x)
{
__int64 ans = 0;
while(n)
{
ans += n / x;
n /= x;
}
return ans;
}
int main()
{
//init();
int cas, n, num1;
__int64 num2;
cin >> cas;
while(cas--)
{
__int64 count = 1;
total = 0;
memset(num, 0, sizeof(num));
scanf("%d", &n);
while(n--)
{
scanf("%d%I64d", &num1, &num2);
fun(num1, num2);
}
__int64 l = 2, r = 0, mid;
for(int i = 0; i < 25; ++i)
r = max(r, a[i] * num[i]);
r = max(r, r);
while(l + 1 < r)
{
mid = (l + r) / 2;
bool flag = true;
for(int i = 0; i < 25 && flag; ++i)
{
if(NumOfX(mid, a[i]) < num[i])
flag = false;
}
if(flag)
r = mid;
else
l = mid;
/*
int temp = mid;
int tt = total;
for(int i = 0; i < 25 && temp != 1; ++i)
{
while(temp % a[i] == 0)
{
temp /= a[i];
num[i]--;
if(num[i] == 0)
tt--;
}
}
if(tt == 0)
r = mid;
else
l = mid;
*/
}
printf("%I64d\n", r);
}
//getchar();
return 0;
}
/*
6
2
3 2
4 1
3
3 2
1 4
2 2
2
45 123
67 23
8
12 11000000046
23 10000004567
45 110000000
7 10000000076
9 1100000576
9 100000000657
24 110000067
42 1000000000
*/
二分啊~~
还是弱爆了。。。

浙公网安备 33010602011771号