2 条题解
-
0
//Dash's Big Day //质因数分解每个数 将每一个出现的底数记录一次 //求出哪一个底数记录数量最大
//Dash's Big Day //质因数分解每个数 将每一个出现的底数记录一次 //求出哪一个底数记录数量最大 #include<bits/stdc++.h> using namespace std; const int M = 1e5 + 1000; //由题意我们知道输出最少为 1 int n; int num[M + 5]; // bool c[M + 8]; int cnt = 0;//此处 一定起始为 0(第一个存了数的是su[1]) 和后面保持统一 避免 % 0 int su[M + 6]; void lineprime(int maxx) { memset(c, true, sizeof(c)); for(int i = 2; i <= maxx; i++ ) { if(c[i]) { su[++cnt] = i; } for(int j = 1; j <= cnt && i % su[j]; j++) { if((long long)su[j] * i <= (long long)maxx) c[su[j] * i] = 0; else break; } } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; if(n == 1) { int x; cin >> x; cout << 1; return 0; } lineprime(M + 1); for (int i = 1; i <= n; i++) { int x; cin >> x; //质因数分解每个数 for(int i = 1; i <= cnt; i++) { if(x == 1) break; //枚举范围缩小至 sqrt(x) if(su[i] * su[i] > x) { num[x]++; break; } //记录底数 if(x % su[i] == 0) { num[su[i]]++; } //除干净 while(x % su[i] == 0) { x /= su[i]; } } } int ans = 1; for (int i = 1; i <= M; i++) { ans = max(ans, num[i]); } cout << ans; }
-
0
#include <bits/stdc++.h> using namespace std; int n, maxSi; int s[112345]; bool p[112345]; int cnt[112345]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; cnt[s[i]]++; maxSi = max(maxSi, s[i]); } p[0] = p[1] = false; for (int i = 2; i <= maxSi; i++) p[i] = true; int ans = 1; for (int i = 2; i <= maxSi; i++) { if (p[i]) { int now = 0; for (int j = i; j <= maxSi; j += i) { now += cnt[j]; p[j] = false; } ans = max(ans, now); } } cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 1263
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 40
- 已通过
- 12
- 上传者