模拟赛t3 太阳神(ra) 题解

太阳神

(a,b):a,ba,bnlcm(a,b)>n

109+7n1010.

原题题解写的看不懂

题意即为求

a=1Nb=1N[lcm(a,b)>N].

转化为

N2a=1Nb=1N[ab/gcd(a,b)N]

a,b最大公约数d提出来,化为

N2d=1Na=1Ndb=1Nd[abNd][gcd(a,b)==1]

之后令

f(x)=a=1xb=1x[abx][gcd(a,b)==1]

于是我们可以先枚举Nd,算出d=1Nf(Nd)即可,由于Nd只有N个,所以只需要利用数论分块枚举N次即可!

接下来考虑如何快速求出f(d)

我们发现:

f(d)=a=1db=1d[abd][gcd(a,b)==1]

=a=1d1b=1d1[abd1][gcd(a,b)==1]+a=1db=1d[ab==d][gcd(a,b)==1]

=f(d1)+a=1db=1d[ab==d][gcd(a,b)==1]

相当于把d质因数分解为piai,对于每个piai,要么给a,要么给b,所以有2sum[d]种方案,sum[d]d的质数约数个数。

于是

f(d)=f(d1)+2sum[d]

sum[d]是可以线性筛的,于是我们就可以O(N)f(d)了!

但是考虑到过于大的数据范围,我们考虑优化:

S(x)=a=1xb=1x[abx]

则有f(x)=a=1xb=1x[abx]t=2xa=1xb=1x[abx][gcd(a,b)==t]

=S(x)t=2xa=1xt2b=1xt2[abxt2][gcd(a,b)==1]

=S(x)t=2xf(xt2)

这里面S(x)是可以数论分块O(x)求得,于是我们可以递归来求f(d)了!别忘了加上记忆化,这里可以用N/x来记忆化。

我们在不爆空的情况下尽可能多筛一些f(d),我这里就筛到了107.对于每一个Nd,时间复杂度就是O(Nd).

计算一下总时间复杂度(log1010107=0.7):

n0.7nddn0.3

于是有

1n0.3nxdx 

=n1n0.3x12dx

=n122x12|1n0.3

=2n0.5(n0.151)

n0.65

所以时间复杂度为O(n0.65)

#define ll long long
#define chr 10000000
const int maxn=1e7+5;
int f[maxn],num[maxn],p[maxn/10],cnt=0;
bool vis[maxn];
ll N;
const int mod=1e9+7;
void gt(int n){
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            num[i]=1;
        }
        for(int j=1;j<=cnt&&p[j]*i<=n;j++){
            vis[p[j]*i]=1;
            if(i%p[j]==0){
                num[p[j]*i]=num[i];
                break;
            }else num[p[j]*i]=num[i]+1;
        }
    }
    for(int i=1;i<=n;i++)
        f[i]=(f[i-1]+(1ll<<num[i]))%mod;
}
int F[maxn];
int f_(ll x){
    if(x<=chr) return f[x];
    if(~F[N/x]) return F[N/x];
    ll ans=0;
    for(ll i=1;i<=x;){
        ll j=x/(x/i);
        ans+=x/i*(1+j-i)%mod;
        ans%=mod;
        i=j+1;
    }
    for(ll i=2;i*i<=x;i++) (ans-=f_(x/(i*i)))%=mod;
    return F[N/x]=ans; 
}
int MAIN(){
    // file();
    cin>>N;gt(chr);memset(F,-1,sizeof F);
    ll ans=0;
    for(ll i=1;i<=N;"chr"){
        ll j=N/(N/i);
        (ans+=(ll)f_(N/i)*(j-i+1)%mod)%=mod;
        i=j+1;
    }
    N%=mod;
    cout<<((N*N-ans)%mod+mod)%mod<<endl;
    return 0;
}

 

posted @   xxqz  阅读(106)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示