P1069 细胞分裂——数学题,质因数分解

P1069 细胞分裂

我们求的就是(x^k)|(m1^m2) k的最小值;

先给m1分解质因数,再给每个细胞分解;

如果m1有的质因数,细胞没有就跳过;

否则就记录答案;

注意整数除法下取整的原则;

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=30010;
 6 int n,m1,m2;
 7 int pre_p[maxn],m_p[maxn],num,cell_p[maxn];;
 8 bool vis[maxn];
 9 
10 void pre_pare()
11 {
12     for(int i=2;i<=30000;i++)
13     {
14         if(!vis[i])
15         {
16             pre_p[++num]=i;
17             if(m1%i==0)
18             {
19                 while(m1%i==0&&m1)
20                 {
21                     m_p[i]+=m2;
22                     m1/=i;
23                 }
24             }
25         }
26         for(int j=1;j<=num;j++)
27         {
28             if(pre_p[j]*i>30000) break;
29             vis[pre_p[j]*i]=1;
30         }
31     }
32 }
33 
34 void fuck_p(int x)
35 {
36     for(int j=1;j<=num;j++)
37     {
38         while(x%pre_p[j]==0&&x)
39         {
40             cell_p[pre_p[j]]++;
41             x/=pre_p[j];
42         }
43     }
44 }
45 
46 
47 int flag;
48 int ans=2147483647,sum;
49 void check()
50 {
51     sum=0;
52     for(int j=1;j<=num;j++)
53     {
54         if(m_p[pre_p[j]]&&!cell_p[pre_p[j]]) {flag=1;return ;}
55         if(m_p[pre_p[j]])
56         {
57             if(!(m_p[pre_p[j]]%cell_p[pre_p[j]])) sum=max(sum,m_p[pre_p[j]]/cell_p[pre_p[j]]);
58             else sum=max(sum,m_p[pre_p[j]]/cell_p[pre_p[j]]+1);
59         }
60     }
61 }
62 int main()
63 {
64     scanf("%d%d%d",&n,&m1,&m2);
65     pre_pare();
66     for(int i=1;i<=n;i++)
67     {
68         flag=0;
69         memset(cell_p,0,sizeof(cell_p));
70         int x;
71         scanf("%d",&x);
72         fuck_p(x);
73         check();
74         if(flag) continue;
75         ans=min(ans,sum);
76     }
77     printf("%d",ans==2147483647?-1:ans); 
78     return 0;
79 }
View Code

 

posted @ 2019-10-10 19:32  AiRomance  阅读(845)  评论(0编辑  收藏  举报