2 条题解

  • 0
    @ 2023-4-18 21:26:58

    //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
      @ 2023-4-15 17:03:58
      #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
      上传者