【LOJ#6052】DIV

  • 本文为博主原创,未经许可不得转载

情形一:$z$的虚部不为$0$(z不是实数)

首先考虑复数这一部分,设$n=(a+bi)(c+di)=ac-bd+(ad+bc)i$

则有$ad+bc=0$,设$\frac{a}{b}=-\frac{c}{d}=\frac{p}{q}$,其中$gcd(p,q)=1$,那么有

$n=x(p+qi)y(p-qi)=xy(p^2+q^2)$,其中$a=px,c=py$

由于$z|n$,所以$z=(p+qi)或(p-qi)$,不妨设$z=(p+qi)$,另一种情况是一样的,最后答案乘2就行了

因此一对$(p,q)$对答案有贡献当且仅当$p^2+q^2|n$,且贡献为$\sum_{x|\frac{n}{p^2+q^2}}px=p \sigma(\frac{n}{p^2+q^2})$($\sigma(n)表示n的约数之和$)

$LHS=\sum_{i=1}^{n}\sum_{p^2+q^2|n}p \sigma(\frac{i}{p^2+q^2})[gcd(p,q)==1]$

$=\sum_{i=1}^{n}\sum_{k|i}\sigma(\frac{i}{k})\sum_{p^2+q^2=k}p[gcd(p,q)==1]$

$=\sum_{k=1}^{n}\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}\sigma(i)\sum_{p^2+q^2=k}p[gcd(p,q)==1]$

$=\sum_{k=1}^{n}\sum_{p^2+q^2=k}pD(\left\lfloor\frac{n}{k}\right\rfloor)[gcd(p,q)==1]$($D(n)表示\sigma(n)的前缀和$)

下底分块枚举,问题就只剩下求$D(n)$,$f(n)=\sum_{p^2+q^2=n}p[gcd(p,q)==1]$及其前缀和$F(n)=\sum_{p^2+q^2<=n}p[gcd(p,q)==1]$

对于$D(n)$,我们有$D(n)=\sum_{i=1}^{n}\sigma(i)=\sum_{i=1}^{n}\sum_{k|i}k=\sum_{k=1}^{n}k\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}1=\sum_{k=1}^{n}k\left\lfloor\frac{n}{k}\right\rfloor$

这个显然可以$O(\sqrt n)$计算

对于$F(n)$,我们考虑消除$p,q$互质的限制:设$G(n)=\sum_{p^2+q^2<=n}p=\sum_{p=1}^{\sqrt n}p\sqrt{n-p^2}$

枚举$d=gcd(p,q)$得到:$F(n)=G(n)-\sum_{d=2}^{\sqrt n}F(\left\lfloor\frac{n}{d^2}\right\rfloor)d$

两者都可以在$O(\sqrt{n})$的时间内计算

利用杜教筛的思想预处理前$n^{\frac{2}{3}}$的值可以做到$O(n^{\frac{2}{3}}\log n)$

  

情形二:$z$的虚部不$0$(z是实数)

这种情况下$LHS=\sum_{i=1}^{n}\sum_{k|i}k=D(n)$

两种情况加起来就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<bits/stdc++.h>
#define FILE "read"
#define MAXN 20000010
#define cadd(a,b) a=add(a,b)
#define csub(a,b) a=sub(a,b)
#define cmul(a,b) a=mul(a,b)
using namespace std;
typedef long long ll;
const int mod=1004535809;
int N,ans,cnt,prime[MAXN/10],D[MAXN],f[MAXN],F[MAXN],vis[MAXN];
bool check[MAXN]; ll n;
inline int add(int a,int b){return (a+=b)>=mod?a-mod:a;}
inline int sub(int a,int b){return (a-=b)<0?a+mod:a;}
inline int mul(int a,int b){return 1LL*a*b%mod;}
inline int gcd(int a,int b){return !b?a:gcd(b,a%b);}
inline int power(int a,int b){
int ret=1;
while(b){
if(b&1) cmul(ret,a);
cmul(a,a); b>>=1;
}return ret;
}
void Init(){
N=(n<=1e9?exp(log(n)/3*2)+1:1e7*2); D[1]=1;
for(int i=2;i<=N;++i){
if(!check[i]) prime[++cnt]=i,D[i]=i+1;
for(int j=1;j<=cnt&&prime[j]*i<=N;++j){
check[prime[j]*i]=1;
if(i%prime[j]==0){
D[prime[j]*i]=sub(mul(prime[j]+1,D[i]),mul(prime[j],D[i/prime[j]]));
break;
}
else D[prime[j]*i]=mul(D[i],D[prime[j]]);
}
}
for(int i=1;i*i<=N;++i)for(int j=1;j*j+i*i<=N;++j)
if(gcd(i,j)==1) cadd(f[i*i+j*j],i);
for(int i=1;i<=N;++i) cadd(f[i],f[i-1]);
for(int i=1;i<=N;++i) cadd(D[i],D[i-1]);
}
inline int solve_D(ll n){
if(n<=N) return D[n];
int ret=0;
for(ll i=1,last;i<=n;i=last+1){
last=n/(n/i);
cadd(ret,mul((n/i)%mod,mul((last-i+1)%mod,mul((last+i)%mod,power(2,mod-2)))));
}return ret;
}
inline int solve_F(ll x){
if(x<=N) return f[x];
ll pos=n/x;
if(vis[pos]) return F[pos];
vis[pos]=1; F[pos]=0;
for(ll i=1;i*i<=x;++i) cadd(F[pos],mul(i,(int)sqrt(x-i*i)%mod));
for(ll i=2;i*i<=x;++i) csub(F[pos],mul(solve_F(x/(i*i)),i));
return F[pos];
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
scanf("%lld",&n); Init();
for(ll i=1,last;i<=n;i=last+1){
last=n/(n/i);
cadd(ans,mul(solve_D(n/i),sub(solve_F(last),solve_F(i-1))));
}
printf("%d\n",add(mul(ans,2),solve_D(n)));
return 0;
}
文章目录
,