Another Easy Problem fzu1753

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

[]   [Go Back]   [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<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<time.h>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 int p[100000]= {0},t,pp[10000];
 9 void init()
10 {
11     long long i,j;
12     t=0;
13     for(i=2; i<1000; i++)
14     {
15         if(!p[i])
16         {
17             p[t++]=i;
18             j=i*i;
19             while(j<100000)
20             {
21                 p[j]=1;
22                 j+=i;
23             }
24         }
25     }
26 }
27 void fun(int n,int k)
28 {
29     int i,j,m,sum;
30     for(i=0; i<t; i++)
31     {
32         m=n;
33         sum=0;
34         while(m)
35         {
36             m/=p[i];
37             sum+=m;
38         }
39 
40         m=k;
41         while(m)
42         {
43             m/=p[i];
44             sum-=m;
45         }
46 
47         m=n-k;
48         while(m)
49         {
50             m/=p[i];
51             sum-=m;
52         }
53         if(pp[i]!=-1)
54         pp[i]=pp[i]>sum?sum:pp[i];
55         else pp[i]=sum;
56     }
57 }
58 int pow3(int a,int b)//求a^b
59 {
60     int r = 1,base = a;
61     while(b!= 0 )
62     {
63         if(b&1)
64             r*= base;
65         base*= base;
66         b>>= 1;
67     }
68     return r;
69 }
70 
71 int main()
72 {
73     init();
74     int tt,m,n,i;
75     while(~scanf("%d",&tt))
76     {
77         memset(pp,-1,sizeof(pp));
78         while(tt--)
79         {
80             scanf("%d%d",&m,&n);
81             fun(m,n);
82         }
83         long long sum=1;
84         for(i=0; i<t; i++)
85         {
86             if(pp[i])
87                 sum*=pow3(p[i],pp[i]);
88         }
89         printf("%I64d
",sum);
90     }
91 }
View Code
原文地址:https://www.cnblogs.com/ERKE/p/3653108.html