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 把这道题又复习了一遍,真是做一次就有不同的坑点
- maxn初始化要初始化在continue前面
- 注意数据范围的特殊数据 m1>=1 ,在质数里1应该永远为重点关注对象,这道题如果maxn不是初始化0的化就会出错
- 还有分解质因数那里,m1>1指数应该是m2而不是1