设
f
(
x
)
=
∑
a
=
0
x
−
1
∑
b
=
0
x
−
1
[
x
∤
a
b
]
f(x)=\sum_{a=0}^{x-1}\sum_{b = 0}^{x-1}[x\nmid ab]
f(x)=a=0∑x−1b=0∑x−1[x∤ab]
g
(
x
)
=
∑
d
∣
x
f
(
d
)
g(x) =\sum_{d\mid x}{f(d)}
g(x)=d∣x∑f(d)
求
g
(
n
)
%
2
64
g(n)\%2^{64}
g(n)%264,
T
T
T组询问,
T
≤
20000
T\le 20000
T≤20000,
n
≤
2
∗
1
0
9
n \le 2*10^9
n≤2∗109
解法:
f
(
x
)
=
∑
a
=
1
x
∑
b
=
1
x
[
x
∤
a
b
]
f(x) =\sum_{a=1}^{x}\sum_{b = 1}^{x}[x\nmid ab]
f(x)=a=1∑xb=1∑x[x∤ab]
容斥得到,
=
x
2
−
∑
a
=
1
x
∑
b
=
1
x
[
x
∣
a
b
]
=x^2-\sum_{a=1}^{x}\sum_{b = 1}^{x}[x\mid ab]
=x2−a=1∑xb=1∑x[x∣ab]
a,x同时除去最大公因子得,
=
x
2
−
∑
a
=
1
x
∑
b
=
1
x
[
x
g
c
d
(
a
,
x
)
∣
a
b
g
c
d
(
a
,
x
)
]
=x^2-\sum_{a=1}^{x}\sum_{b = 1}^{x}[\frac{x}{gcd(a,x)}\mid \frac{ab}{gcd(a,x)}]
=x2−a=1∑xb=1∑x[gcd(a,x)x∣gcd(a,x)ab]
a
g
c
d
(
a
,
x
)
\frac{a}{gcd(a,x)}
gcd(a,x)a肯定和
x
g
c
d
(
a
,
x
)
\frac{x}{gcd(a,x)}
gcd(a,x)x互质,所以,
=
x
2
−
∑
a
=
1
x
∑
b
=
1
x
[
x
g
c
d
(
a
,
x
)
∣
b
]
=x^2-\sum_{a=1}^{x}\sum_{b = 1}^{x}[\frac{x}{gcd(a,x)}\mid b]
=x2−a=1∑xb=1∑x[gcd(a,x)x∣b]
∑
b
=
1
x
[
x
g
c
d
(
a
,
x
)
∣
b
]
\sum_{b = 1}^{x}[\frac{x}{gcd(a,x)}\mid b]
∑b=1x[gcd(a,x)x∣b]其实求1到x有多少个数被
x
g
c
d
(
a
,
x
)
\frac{x}{gcd(a,x)}
gcd(a,x)x整除,所以,
=
x
2
−
∑
a
=
1
x
x
x
g
c
d
(
a
,
x
)
=x^2-\sum_{a=1}^{x}\frac{x}{\frac{x}{gcd(a,x)}}
=x2−a=1∑xgcd(a,x)xx
=
x
2
−
∑
a
=
1
x
g
c
d
(
a
,
x
)
=x^2-\sum_{a=1}^{x}gcd(a,x)
=x2−a=1∑xgcd(a,x)
换枚举方式,枚举x的所有因子d
=
x
2
−
∑
d
∣
x
d
∑
a
=
1
x
[
g
c
d
(
a
,
x
)
=
=
d
]
=x^2-\sum_{d\mid x}d\sum_{a=1}^{x}[gcd(a,x)==d]
=x2−d∣x∑da=1∑x[gcd(a,x)==d]
=
x
2
−
∑
d
∣
x
d
∑
a
=
1
x
d
[
g
c
d
(
a
,
x
d
)
=
=
1
]
=x^2-\sum_{d\mid x}d\sum_{a=1}^{\frac{x}{d}}[gcd(a,\frac{x}{d})==1]
=x2−d∣x∑da=1∑dx[gcd(a,dx)==1]
引用欧拉函数的定义
φ
(
x
)
\varphi(x)
φ(x),
f
(
x
)
=
x
2
−
∑
d
∣
x
d
∗
φ
(
x
d
)
f(x)=x^2-\sum_{d\mid x}{d*\varphi(\frac{x}{d})}
f(x)=x2−d∣x∑d∗φ(dx)
带入
g
(
n
)
g(n)
g(n),
g
(
n
)
=
∑
x
∣
n
x
2
−
∑
x
∣
n
∑
d
∣
x
d
∗
φ
(
x
d
)
g(n) = \sum_{x\mid n}x^2-\sum_{x|n}\sum_{d|x}d*\varphi(\frac{x}{d})
g(n)=x∣n∑x2−x∣n∑d∣x∑d∗φ(dx)
设
T
=
x
d
T=\frac{x}{d}
T=dx,
g
(
n
)
=
∑
x
∣
n
x
2
−
∑
d
T
∣
n
∑
d
∣
n
d
∗
φ
(
T
)
g(n) = \sum_{x\mid n}x^2-\sum_{dT|n}\sum_{d|n}d*\varphi(T)
g(n)=x∣n∑x2−dT∣n∑d∣n∑d∗φ(T)
=
∑
x
∣
n
x
2
−
∑
T
∣
n
d
∑
d
∣
n
d
∗
φ
(
T
)
= \sum_{x\mid n}x^2-\sum_{T|\frac{n}{d}}\sum_{d|n}d*\varphi(T)
=x∣n∑x2−T∣dn∑d∣n∑d∗φ(T)
=
∑
x
∣
n
x
2
−
∑
d
∣
n
d
∑
T
∣
n
d
φ
(
T
)
= \sum_{x\mid n}x^2-\sum_{d\mid n}d\sum_{T|\frac{n}{d}}\varphi(T)
=x∣n∑x2−d∣n∑dT∣dn∑φ(T)
注意到
∑
T
∣
n
d
φ
(
T
)
=
n
d
\sum_{T|\frac{n}{d}}\varphi(T)=\frac{n}{d}
∑T∣dnφ(T)=dn,
g
(
n
)
=
∑
x
∣
n
x
2
−
∑
d
∣
n
d
∗
n
d
=
∑
x
∣
n
x
2
−
∑
d
∣
n
n
g(n) = \sum_{x\mid n}x^2-\sum_{d|n}d*\frac{_n}{^d}=\sum_{x\mid n}x^2-\sum_{d|n}n
g(n)=x∣n∑x2−d∣n∑d∗dn=x∣n∑x2−d∣n∑n
g
(
n
)
=
∑
d
∣
n
x
2
−
n
g(n)=\sum_{d\mid n}x^2-n
g(n)=d∣n∑x2−n
这个式子是求n的所有因子的平方和减去所有因子的个数乘N的差,质因子分解后求就行。还有记得使用unsigned long long。
#include <iostream>
#include <cstdio>
#define ll long long
#define llu unsigned ll
using namespace std;
const int N = 1e5+10;
llu p[N], prime[N], m;
ll n;
void primes(int n){
for(int i = 2; i <= n; i++){
if(!p[i]) p[i] = i, prime[++m] = i;
for(int j = 1; j <= m; j++){
if(prime[j] > p[i] || prime[j] > n/i) break;
p[i*prime[j]] = prime[j];
}
}
//for(int i = 1; i <= m; i++) cout << prime[i] << endl;
}
int main(){
primes(1e5);
int t;
scanf("%d", &t);
while(t--){
scanf("%lld", &n);
llu ans1 = 1, ans2 = n;
for(int i = 1; i <= m && prime[i] * prime[i]<= n; i++){
if(n%prime[i] == 0){
llu cnt = 1, tmp = 1, base = 1;
while(n%prime[i] == 0){
base *= prime[i];
tmp += base*base;
cnt++;
n /= prime[i];
}
ans1 *= tmp;
ans2 *= cnt;
//123
}
}
if(n > 1){
ans1 *= n*n+1;
ans2 *= 2;
}
printf("%llu\n", ans1-ans2);
}
return 0;
}