1 条题解

  • 2
    @ 2024-10-26 20:33:18

    题目大意:有 nn 组查询,每次查询一个数 aa 的所有质数因子并按升序输出。

    思路:由题目数据范围可得,查询次数范围1n1001≤n≤100 ,查询数字 aa 的范围为 2a10102≤a≤10^{10} , 因此我们可以直接使用朴素筛法优化,即从 11a\sqrt{a} 的暴力枚举去查找 aa 的质数因子(其时间复杂度为 nn * a\sqrt{a} ),为了保证每次存的都是质数因子,我们会对其找到的因子 ii 进行 xx /=/= ii 的计算,把其 ii 的倍数都筛掉,最后输出的时候要对我们存好的因子的数组 mpmp 进行排序去重就解决了。

    #include<bits/stdc++.h>
    #define int long long
    #define endl '\n'
    using namespace std;
    const int N = 2e5 + 9;
    int mp[N], cnt;
    
    void check(int x) {
        cnt = 0;
    	for(int i = 2; i <= sqrt(x); i ++) {
    		while(x % i == 0) {
    			mp[++ cnt] = i;
    			x /= i;
    		}
    	}
    	if(x > 1) mp[++ cnt] = x;
    }
    
    void solve() {
        memset(mp, 0, sizeof(mp));
        int n;
        cin >> n;
        check(n);
        sort(mp + 1, mp + 1 + cnt);
        for(int i = 1; i <= cnt; i ++) {
            if(mp[i] == mp[i - 1]) continue;
            cout << mp[i] << " ";
        }
        cout << endl;
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
    
        int t = 1;
        cin >> t;
    
        while(t --) solve();
        return 0;
    }
    
    • @ 2024-10-29 10:10:30
      #include<set>	
      #include<math.h>
      //头文件放最前面  ! 
      using namespace std;
      
      #define int long long
      
      //为啥上筛子还超时了 
      signed main() {
      	int a;
      	cin >> a;
      	set<int>arr;
      	while (a--) {
      		int n;
      		arr.clear();
      		cin >> n;
      		//分解因式!
      		//本身如果n%i是找因子 加上一个i*i就变成了质因子? 
      		for (int i = 2; i<=sqrt(n); i++) {
      			while (n % i == 0) {
      				n = n / i;
      				arr.insert(i);
      			}
      		}
      		//emmm但是这个不如素数筛啊 但是筛子超了
      		//这个会漏啊 需要加一个if给与n的判断 
      		if(n!=1){
      			arr.insert(n);
      		}  	
      		for(int num:arr){
      			cout<<num<<" ";
      		}
      		cout << endl;
      	}
      	return 0;
      } 放一个set的写法
      
  • 1

信息

ID
1027
时间
1000ms
内存
256MiB
难度
9
标签
递交数
249
已通过
20
上传者