问大佬,是不是复杂度分析错了
查看原帖
问大佬,是不是复杂度分析错了
305928
zhoumurui楼主2025/6/25 23:09

我认为我这份代码的复杂度是 O(nlogn)O(\sqrt n\log n) 但是极限卡过。

我的复杂度分析:

主函数中的数论分块不计算 f(p,q)f(p,q) 的复杂度显然是 O(n)O(\sqrt n),而 f(p,q)f(p,q)O(p)O(p) 的,调和级数的话,复杂度应该是 O(nlogn)O(\sqrt n\log n) 吧。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7;
signed st[N+5],pr[N+5],cnt,s[N+5];
int f(int n,int m){
    int ans=0;
    for (int i=1;i<=n;i++){
        int p=n/i,q=m/i;
        p=p*(p+1)/2,q=q*(q+1)/2;
        p%=20101009,q%=20101009;
        ans+=s[i]*i*i%20101009*p%20101009*q%20101009;
    }
    return ans%20101009;
}
signed main(){
    s[1]=1;
    for (signed i=2;i<=N;i++){
        if (!st[i])pr[++cnt]=i,s[i]=-1;
        for (signed j=1;j<=cnt&&pr[j]<=N/i;j++){
            st[i*pr[j]]=1;
            if (i%pr[j])s[i*pr[j]]=-s[i];
            else{
                s[i*pr[j]]=0;break;
            }
        }
    }
    int n,m;
    cin>>n>>m;
    int ans=0;
    int l=1,r;
    while (l<=n&&l<=m){
        r=min(n/(n/l),m/(m/l));
        int p=(r+l)*(r-l+1)/2;
        p%=20101009;
        ans+=p*f(n/l,m/l);
        ans%=20101009;
        l=r+1;
    }
    ans=(ans+20101009)%20101009;
    cout<<ans<<"\n";
    return 0;
}
2025/6/25 23:09
加载中...