fzu 1753 质因数的应用

Another Easy Problem
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

xtt最近学习了高斯消元法解方程组,现在他的问题来了,如果是以下的方程,那么应该如何解呢?

C(n1,m1)==0 (mod M)

C(n2,m2)==0 (mod M)

C(n3,m3)==0 (mod M)

................

C(nk,mk)==0 (mod M)

xtt希望你告诉他满足条件的最大的M

其中C(i,j)表示组合数,例如C(5,2)=10,C(4,2)=6...

Input

输入数据包括多组,每组数据的第一行是一个正整数T(1<=T<=150)表示接下来描述的T个方程

接下来T行,每行包括2个正整数ni,mi (1<=mi<=ni<=100000)

Output

输出一行答案,表示满足方程组的最大M。

Sample Input

3
100 1
50 1
60 1

Sample Output

10

 

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 typedef __int64 LL;
 8 const int maxn=1e5+5;
 9 int prime[10000],num,n[200],m[200];
10 bool flag[maxn];
11 
12 void init()
13 {
14     memset(flag,true,sizeof(flag));
15     int i,j;num=0;
16     for(i=2;i<maxn;i++)
17     {
18         if(flag[i]) prime[num++]=i;
19         for(j=0;j<num&&i*prime[j]<maxn;j++)
20         {
21             flag[i*prime[j]]=false;
22             if(i%prime[j]==0) break;
23         }
24     }
25 }
26 
27 int factor(int a,int b)
28 {
29     int sum=0;
30     while(b)
31     {
32         sum+=b/a;
33         b/=a;
34     }
35     return sum;
36 }
37 
38 int getfactor(int i,int j)
39 {
40     int sum=factor(prime[i],n[j]);
41     sum-=factor(prime[i],m[j]);
42     sum-=factor(prime[i],n[j]-m[j]);
43     return sum;
44 }
45 
46 LL mypow(LL a,LL b)
47 {
48     LL ret=1;
49     while(b)
50     {
51         if(b&1) ret*=a;
52         a*=a;
53         b>>=1;
54     }
55     return ret;
56 }
57 
58 LL solve(int n,int MAX)
59 {
60     LL ans=1;
61     for(int i=0;i<num&&prime[i]<=MAX;i++)
62     {
63         int min=10000,c;
64         for(int j=0;j<n;j++)
65         {
66             c=getfactor(i,j);
67             min=min<c?min:c;
68         }
69         ans*=mypow(prime[i],min);
70     }
71     return ans;
72 }
73 
74 int main()
75 {
76     init();
77     int i,t,MIN;
78     while(~scanf("%d",&t))
79     {
80         MIN=1e9;
81         for(i=0;i<t;i++)
82         {
83             scanf("%d %d",n+i,m+i);
84             MIN=MIN<n[i]?MIN:n[i];
85         }
86         printf("%I64d\n",solve(t,MIN));
87     }
88     return 0;
89 }

 

posted on 2014-07-17 13:11  雄..  阅读(163)  评论(0编辑  收藏  举报

导航