数学、筛法、线性筛/欧拉筛

线性筛求出值域内每个数的最小质因数,分解 $i$ 时不断将 $i$ 除以其最小质因数。

预处理时间复杂度 $O(V)$,单次分解质因数时间复杂度 $O(\log n)$。

#include<bits/stdc++.h>
using namespace std;
constexpr int lim=100000000;
int T,n,cnt,p[6000001],s[100000001];
bool on[100000001];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    on[0]=on[1]=1;
    for(int i=2;i<=lim;i++){
        if(!on[i]) p[++cnt]=s[i]=i;
        for(int j=1;j<=cnt&&i*p[j]<=lim;j++){
            on[i*p[j]]=1,s[i*p[j]]=p[j];
            if(i%p[j]==0) break;
        }
    }
    for(cin>>T;T!=0;T--){
        int ans=0;
        cin>>n;
        while(n!=1) ans^=s[n],n/=s[n];
        cout<<ans<<'\n';
    }
    return 0;
}
最后修改:2024 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏