思路:
首先将$30000$以内的所有质数求出,再对$m1$质因数分解。
对于每个$s$,计算它和$m1$的每个公共质因数的倍数关系,取$max$则为该细胞满足条件所花费的最少时间。
再对于每个细胞的最小时间取$min$,即为所求的结果。
注意特判$m1=1$和$m2=0$的情况。
1 #include<cmath> 2 #include<cstdio> 3 #include<cctype> 4 #include<vector> 5 inline int getint() { 6 char ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 10 return x; 11 } 12 const int inf=0x7fffffff; 13 std::vector<int> prime; 14 inline bool isPrime(const int x) { 15 for(unsigned i=0;i<prime.size();i++) { 16 if(prime[i]>sqrt(x)) break; 17 if(!(x%prime[i])) return false; 18 } 19 return true; 20 } 21 const int M1=30001; 22 int p[M1]; 23 int main() { 24 int n=getint(),m1=getint(),m2=getint(); 25 if(m1==1||!m2) { 26 puts("0"); 27 return 0; 28 } 29 for(int i=2;i<M1;i++) { 30 if(isPrime(i)) { 31 prime.push_back(i); 32 } 33 } 34 for(unsigned i=0;m1!=1;i++) { 35 while(!(m1%prime[i])) { 36 p[i]+=m2; 37 m1/=prime[i]; 38 } 39 } 40 int ans=inf; 41 while(n--) { 42 int s=getint(),tmp=0; 43 for(unsigned i=0;i<prime.size();i++) { 44 if(!p[i]) continue; 45 int cnt=0; 46 if(s%prime[i]) goto Next; 47 while(!(s%prime[i])) { 48 cnt++; 49 s/=prime[i]; 50 } 51 tmp=std::max(tmp,(p[i]-1)/cnt); 52 } 53 ans=std::min(ans,tmp); 54 Next:; 55 } 56 printf("%d\n",ans==inf?-1:ans+1); 57 return 0; 58 }