一個小問題
查看原帖
一個小問題
590600
Kreado楼主2024/3/15 11:49

爲什麽這個是錯的

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll Mod=1e9+7,Maxn=3e6+7,inv2=500000004,inv3=333333336;
ll n,sq,cnt;
ll g1[Maxn],g2[Maxn],id[Maxn],S;
ll pos1[Maxn],pos2[Maxn],sp[Maxn],g[Maxn];
ll sg1[Maxn],sg2[Maxn];

inline ll up(ll x){
	return (x%Mod+Mod)%Mod;
}

ll p[Maxn],tot;
bitset<Maxn>isp;
inline void init(ll N){
	isp[0]=isp[1]=1;
	for(ll i=2;i<=N;i++){
		if(!isp[i]){
            p[++tot]=i;
            if(tot>1) sg1[tot]=(sg1[tot-1]+i)%Mod,sg2[tot]=(sg2[tot-1]+1ll*i*i%Mod)%Mod;
            else sg1[tot]=i,sg2[tot]=i*i%Mod;    
        }
		for(ll j=1;j<=tot;j++){
			const ll t=i*p[j];if(t>N) break;
			isp[t]=1;if(!(i%p[j])) break;
		}
	}
}

inline ll Get(ll x){
	if(x<=sq) return pos1[x];
    return pos2[n/x];
}

ll G(ll x,ll y){
	if(p[y]>x) return 0;
	ll ret=up((g2[Get(x)]-g1[Get(x)])-(sg2[y]-sg1[y]));
	for(ll i=y+1;i<=tot&&1ll*p[i]*p[i]<=x;i++){
		for(ll c=1,j=p[i];j<=x;c++,j*=p[i]){
			ll res=j%Mod*up(j-1)%Mod;
			ret=up(ret+res*G(x/j,i)%Mod+(c>1)*res%Mod);
		}
	}
	return ret;
}

int main(){
	scanf("%lld",&n);
	sq=sqrt(n); 
	init(sq);
	cnt=sq+n/sq-1;
	for(ll i=1;i<=cnt;i++) {
        id[i]=i<=sq?n/i:id[i-1]-1,g1[i]=id[i]%Mod,
		g2[i]=up(g1[i]*(g1[i]+1)%Mod*inv2%Mod*(2*g1[i]+1)%Mod*inv3%Mod-1),g1[i]=up(g1[i]*(g1[i]+1)%Mod*inv2%Mod-1);

        if(id[i]<=sq) pos1[id[i]]=i;
        else pos2[n/id[i]]=i;

    }
		

	for(ll j=1;j<=tot;j++)
		for(ll i=1;i<=cnt&&id[i]>=1ll*p[j]*p[j];i++)
            g1[i]=up(g1[i]-1ll*p[j]*up(g1[Get(id[i]/p[j])]-sg1[j-1])%Mod),
			g2[i]=up(g2[i]-1ll*p[j]*p[j]%Mod*up(g2[Get(id[i]/p[j])]-sg2[j-1])%Mod);
			
	printf("%lld",up(G(n,0)+1));
	return 0;
}


/*
633333336
*/

將記錄位置的 pos1,pos2 改成 unordered_map 就對了

2024/3/15 11:49
加载中...