P1069 [NOIP2009 普及组] 细胞分裂

原题链接

考察:分解质因数

卡死我的是我不知道如何存储S和m1的每一个质因数,一个个对比又觉得好麻烦..结果看了大佬的题解...对不起我是fw

正确思路:

       题目应该是比较明显的分解质因数...这道题我们只需要存储m1的质因数.对于每一个S,我们直接让它÷m1的质因数即可.如果不能全部都除尽,那么S不能达到要求,如果可以,就计算达到m1的次数即可

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 using namespace std;
 6 const int N =  30010;
 7 typedef pair<int,int> pii;
 8 typedef long long ll;
 9 vector<pii> v;
10 void Divide(int m1,int m2)
11 {
12     for(int i=2;i<=m1/i;i++)
13     {
14         if(m1%i==0)
15         {
16             int s = 0;
17             while(m1%i==0) m1/=i,s++;
18             v.push_back({i,s*m2});
19         }
20     }
21     if(m1>1) v.push_back({m1,m2});
22 }
23 int main()
24 {
25 //    freopen("in.txt","r",stdin);
26     int n,m1,m2,minv = 0x3f3f3f3f;
27     scanf("%d%d%d",&n,&m1,&m2);
28     Divide(m1,m2);
29     while(n--)
30     {
31         ll x; scanf("%lld",&x);//如果m1是质数的倍数, 它一定会分解为质数,如果有答案则一定有质数的倍数 
32         bool flag = 0; int maxn = 0;
33         for(int i=0;i<v.size();i++)
34         { 
35             int s = 0;
36             while(x%v[i].first==0)
37             {
38                 x/=v[i].first;
39                 s++;
40             }
41             if(!s) { flag = 1; break; } 
42             int cnt = v[i].second/s;
43             if(v[i].second%s!=0) cnt++;
44             maxn = max(cnt,maxn);
45         }
46         if(flag) continue;//maxn初始化要放到continue前面,否则无法更新 
47         minv = min(maxn,minv);
48     }
49     if(minv==0x3f3f3f3f) puts("-1");
50     else printf("%d\n",minv);
51     return 0;
52 } 

 

 

 

2021.1.24 把这道题又复习了一遍,真是做一次就有不同的坑点

  1. maxn初始化要初始化在continue前面
  2. 注意数据范围的特殊数据 m1>=1 ,在质数里1应该永远为重点关注对象,这道题如果maxn不是初始化0的化就会出错
  3. 还有分解质因数那里,m1>1指数应该是m2而不是1
posted @ 2021-01-15 20:31  acmloser  阅读(190)  评论(0编辑  收藏  举报