posts - 16,comments - 0,trackbacks - 0
给出 2n 个数,求最大的 x 满足 x!%M = 0 ,其中 M = a1^b1*a2^b2*a3^b3…*an^bn 。

Input

In the first line is an integer T (1<=T<=50) indicating the number of test cases.
Each test case begins with an integer n (1<=n<=100), then followed n lines. Each line contains two numbers ai and bi (1 <= ai <= 100, 1<=bi<=10000000000000)

Output

For each test case output the result x in one line.

Source
2010 Asia Regional Hangzhou Site Online Contest
# include <stdio.h>
# include 
<string.h>
# include 
<math.h>

# define N 
101
typedef 
long long int LL;

int n;
/*******************************************************/
int p[50], top = 0;
int isPrime(int x)
{
                
int i;
                
if (x%2==0return x==2;
                
if (x%3==0return x==3;
                
if (x%5==0return x==5;
                
for (i = 7; i < x; i += 5)
                                
if (x%== 0return 0;
                
return 1;
}

void pre(void)
{
                
int i;
                
for (i = 2; i < N; ++i)
                                
if (isPrime(i)) p[top++= i;
}
/*******************************************************/
LL pn[
50];
void init(void)
{
                
int i, j, x;
                LL cnt;
                LL num;
                memset(pn, 
0sizeof(pn));
                scanf(
"%d"&n);
                
for (i = 0; i < n; ++i)
                {
                                scanf(
"%d%I64d"&x, &num);
                                
for (j = 0; j < top; ++j)
                                {
                                                
if (x%p[j] == 0)
                                                {
                                                                cnt 
= 0;
                                                                
while (x%p[j]==0++cnt, x/=p[j];
                                                                pn[j] 
+= cnt*num;
                                                }
                                }
                }
}
LL Max(LL x, LL y)
{
                
return x>? x:y;
}

LL mypow(
int pr, int cnt)
{
                LL ret 
= 1;
                
while (cnt > 0--cnt, ret *= pr;
                
return ret;
}

LL cal(
int pr, LL tot)
{
                
int tmp;
                LL ppow 
= 0, temp;
                
while (tot > 0)
                {
                                tmp 
= (int)floor(log(tot*(pr-1)+1)/log(pr))+1;
                                
while ((mypow(pr, tmp)-1)/(pr-1> tot) --tmp;
                                temp 
= mypow(pr, tmp);
                                ppow 
+= temp;
                                tot 
-= (temp-1)/(pr-1);
                }
                
return ppow;
}
void solve(void)
{
                
int i;
                LL ans 
= 0;
                
for (i = 0; i < top; ++i) if (pn[i] != 0)
                                                ans 
= Max(ans, cal(p[i], pn[i]));
                printf(
"%I64d\n", ans);
}

int main()
{
                
int T;
                pre();
                scanf(
"%d"&T);
                
while (T--) init(), solve();

                
return 0;
}

posted on 2012-09-08 16:01 yajunw 阅读(162) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理