1 条题解

  • 0
    @ 2026-8-4 15:02:26

    #include<bits/stdc++.h> using namespace std; int n, m1, m2; const int N = 1e4+10, M = 3e4+10; int s[N]; bool vis[M]; int prime[M], cnt; int res[M], d;//存储m1的质因数 int rescnt[M];//来存储m1每个质因数的次方 bool vist[N]; void init(){ for (int i = 2; i <= M; i ++){ if(vis[i]) continue; prime[++ cnt] = i; vis[i] = true; for (int j = 1; j <= cnt && i * prime[j] <= M; j ++){ vis[i * prime[j]] = true; if(i % prime[j] == 0) break; } } } void solve(int x){ for (int i = 1; prime[i] <= x; i ++){ if(x % prime[i] == 0){ res[++ d] = prime[i]; while(x % prime[i] == 0){ x /= prime[i]; rescnt[d] ++; } rescnt[d] = m2; } } if(x > 1){ res[++d] = x; rescnt[d] = m2; } } int main(){ cin >> n; cin >> m1 >> m2; for (int i = 1; i <= n; i++) { cin >> s[i]; } / 我先预处理m1的质因数有哪些,还有对应的质因数的次方 */ init();//预处理筛选出所有的质因数 //处理我们的m1这个数的所有质因数和次方m1^m2 solve(m1); //对我们的每个细胞si进行处理 int maxx = 1e9; for (int i = 1; i <= n; i ++){ int x = 0;//x表示我们当前第i个细胞,所需要的时间为x for (int j = 1; j <= d; j ++){ //枚举m1的所有质因子,如果当前质因子si是没有的话 //那必然不可能平分到每个试管当中 int p = res[j];//p是m1的第j个质因数 if(s[i] % p != 0){ vist[i] = true;//true代表不行 break; }else{ int k = 0;//p这个质因子有多少个 while(s[i] % p == 0){ s[i] /= p; k ++; } if(rescnt[j] > k){ if(rescnt[j] % k == 0){ x = max(rescnt[j] / k , x); }else{ x = max(rescnt[j] / k + 1, x); } } } } if(!vist[i]){ maxx = min(x, maxx); } } int l = 0; for (int i = 1; i <= n; i ++){ if(vist[i] == true) l ++; } if(l >= n){ puts("-1"); }else{ cout << maxx; } return 0; }

    • 1

    信息

    ID
    454
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    148
    已通过
    18
    上传者