1 条题解

  • 0
    @ 2026-7-7 22:13:35

    #include<bits/stdc++.h>
    using namespace std;
    
    using ll=long long;
    
    const int N = 2e6+10;
    
    
    const ll mod = 1e9+7;
    constexpr ll ksm(ll a,ll b){
        ll r = 1;
        while(b){
            if(b&1)r=r*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return r;
    }
    constexpr ll inv2 = ksm(2, mod-2);
    constexpr ll sum(ll n){n%=mod;return n*(n+1)%mod*inv2%mod;}
    
    ll n;
    
    ll p[N],tot;
    bool vis[N];
    
    ll id1[N],id2[N],v[N],m;
    ll get(ll x){return x<N?id1[x]:id2[n/x];}
    
    ll g1[N],g2[N],g[N];
    
    ll f(ll P,ll K){return (P^K)%mod;}
    ll S[N];
    int main(){
        for(int i=2;i<N;i++){
            if(!vis[i])p[++tot]=i;
            for(int j=1;j<=tot && i*p[j]<N;j++){
                vis[i*p[j]]=1;
                if(i%p[j]==0)break;
            }
        }
    
        cin>>n;
    
        for(ll l=1,r;l<=n;l=r+1){
            r=n/(n/l);
            v[++m]=n/l;
            if(v[m]<N)id1[v[m]]=m;
            else id2[n/v[m]]=m;
    
            g1[m]=(sum(v[m])+mod-1)%mod, g2[m]=(v[m]-1+mod)%mod;
        }
        for(int j=1;j<=tot;j++){
            for(int i=1;i<=m && p[j]<=v[i]/p[j];i++){
                g1[i] = (g1[i] - p[j]*(g1[get(v[i]/p[j])]-g1[get(p[j-1])]+mod)%mod + mod) % mod;
                g2[i] = (g2[i] - (g2[get(v[i]/p[j])] - g2[get(p[j-1])])%mod + mod) % mod;
            }
    
        }
    
        for(int i=1;i<=m;i++)g[i]=(g1[i]-g2[i]+mod + (v[i]>=2?2:0))%mod;
    
        for(int i=1;i<=m;i++)S[i]=g[i];
        for(int j=tot-1;j>=0;j--){
            for(int i=1;i<=m && p[j+1]<=v[i]/p[j+1];i++){
                for(ll w=p[j+1],k=1;w<=v[i]/p[j+1];w*=p[j+1],++k){
                    S[i] = (S[i] + f(p[j+1],k)*(S[get(v[i]/w)]-g[get(p[j+1])]+mod)%mod + f(p[j+1],k+1))%mod;
                }
            }
        }
    
        for(int i=1;i<=m;i++)S[i]=(S[i]+1)%mod;
        sort(S+1,S+1+m);
        m=unique(S+1,S+1+m)-S-1;  
    
        ll ans = 0;
        for(int i=1;i<=m;i++)ans^=S[i];
        cout << ans << '\n';
        return 0;
    }
    
    • 1

    信息

    ID
    9715
    时间
    10000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者