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;
    }
    

    信息

    ID
    1263
    时间
    2000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    40
    已通过
    12
    上传者