我认为我这份代码的复杂度是 O(nlogn) 但是极限卡过。
我的复杂度分析:
主函数中的数论分块不计算 f(p,q) 的复杂度显然是 O(n),而 f(p,q) 是 O(p) 的,调和级数的话,复杂度应该是 O(nlogn) 吧。
#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;
}