Description
定义
f
(
m
)
=
∑
i
=
0
m
−
1
∑
j
=
0
m
−
1
[
g
c
d
(
m
,
i
∗
j
)
≠
m
]
f(m) = \sum^{m-1}_{i=0}\sum^{m-1}_{j=0}[gcd(m,i*j) \ne m]
f(m)=∑i=0m−1∑j=0m−1[gcd(m,i∗j)̸=m]
求
g
(
n
)
=
∑
m
∣
n
f
(
m
)
g(n) = \sum_{m|n}f(m)
g(n)=∑m∣nf(m)
Input
The first line contains an integer
T
T
T indicating the total number of test cases. Each test case is a line with a positive integer
n
n
n.
1
≤
T
≤
20000
1\leq T\leq 20000
1≤T≤20000
1
≤
n
≤
1
0
9
1\leq n\leq 10^9
1≤n≤109
Output
For each test case, print one integer s s s, representing g ( n ) g(n) g(n) modulo 2 64 2^{64} 264.
Solution
考虑
f
(
x
)
f(x)
f(x)的反面
h
(
x
)
h(x)
h(x)
f
(
m
)
=
m
2
−
h
(
m
)
f(m) = m^2- h(m)
f(m)=m2−h(m)
h
(
m
)
=
∑
i
=
0
m
−
1
∑
j
=
0
m
−
1
[
g
c
d
(
m
,
i
∗
j
)
=
m
]
h(m) = \sum^{m-1}_{i=0}\sum^{m-1}_{j=0}[gcd(m,i*j) = m]
h(m)=i=0∑m−1j=0∑m−1[gcd(m,i∗j)=m]
那么对于
h
(
x
)
h(x)
h(x)进行变化。
考虑
i
,
j
i,j
i,j的所有取值情况,在满足
g
c
d
(
m
,
i
j
)
=
m
gcd(m,ij) = m
gcd(m,ij)=m的情况下二元组
(
i
,
j
)
(i,j)
(i,j)有多少种。
我们考虑枚举
m
m
m的所有因子
d
d
d
如果
g
c
d
(
m
,
i
)
=
d
gcd(m,i) = d
gcd(m,i)=d,则要使得满足条件
g
c
d
(
m
,
i
j
)
=
m
gcd(m,ij) = m
gcd(m,ij)=m,
j
j
j需要满足条件
m
d
∣
j
\frac{m}{d}|j
dm∣j。
因为这样
j
j
j中包含了
m
d
\frac{m}{d}
dm,相乘后
i
j
ij
ij中才能包含
m
m
m,也就是
m
∣
i
j
m|ij
m∣ij。
以上也就是说满足
d
∣
i
,
m
d
∣
j
d|i,\frac{m}{d}|j
d∣i,dm∣j时有
m
∣
i
j
m|ij
m∣ij,则
g
c
d
(
m
,
i
j
)
=
m
gcd(m,ij)=m
gcd(m,ij)=m。
那么对于
i
i
i有
0
≤
i
<
m
0\leq i <m
0≤i<m 且
g
c
d
(
m
,
i
)
=
d
gcd(m,i) = d
gcd(m,i)=d
i
i
i取值可以为
k
∗
d
(
1
≤
k
≤
m
d
)
k*d(1 \leq k \leq \frac{m}{d})
k∗d(1≤k≤dm),因为有
d
∣
i
d|i
d∣i,所以
i
=
k
∗
d
i = k*d
i=k∗d。
要满足
g
c
d
(
m
,
i
)
=
d
gcd(m,i) = d
gcd(m,i)=d
g
c
d
(
m
,
k
∗
d
)
=
d
gcd(m,k*d)=d
gcd(m,k∗d)=d
g
c
d
(
m
d
,
k
)
=
1
gcd(\frac{m}{d},k) = 1
gcd(dm,k)=1
于是
k
k
k的取值个数为
φ
(
m
d
)
\varphi(\frac{m}{d})
φ(dm),这也是
i
i
i的取值个数。
接下来考虑在满足上述条件下的
j
j
j的所有可能取值。
m
d
∣
j
(
0
≤
j
<
m
)
\frac{m}{d}|j\qquad(0\leq j < m)
dm∣j(0≤j<m)
则可以写成
j
=
k
∗
m
d
j = k * \frac{m}{d}
j=k∗dm
于是
[
k
]
=
m
m
d
=
d
[k]= \frac{m}{\frac{m}{d}} = d
[k]=dmm=d
于是
k
k
k的取值个数为
d
d
d,这也是
j
j
j的取值个数。
综上我们得到
h
(
m
)
h(m)
h(m)和
f
(
m
)
f(m)
f(m)的表达式
h
(
m
)
=
∑
d
∣
m
d
∗
φ
(
m
d
)
h(m) =\sum_{d|m}d*\varphi(\frac{m}{d})
h(m)=d∣m∑d∗φ(dm)
f
(
m
)
=
m
2
−
h
(
m
)
=
m
2
−
∑
d
∣
m
d
∗
φ
(
m
d
)
f(m) =m^2 - h(m) = m^2 - \sum_{d|m}d*\varphi(\frac{m}{d})
f(m)=m2−h(m)=m2−d∣m∑d∗φ(dm)
那么接下来是
g
(
n
)
g(n)
g(n)
g
(
n
)
=
∑
m
∣
n
f
(
m
)
g(n) = \sum_{m|n}f(m)
g(n)=m∣n∑f(m)
g
(
n
)
=
∑
m
∣
n
m
2
−
∑
m
∣
n
∑
d
∣
m
d
∗
φ
(
m
d
)
g(n) = \sum_{m|n}m^2-\sum_{m|n}\sum_{d|m}d*\varphi(\frac{m}{d})
g(n)=m∣n∑m2−m∣n∑d∣m∑d∗φ(dm)
令
g
1
(
n
)
=
∑
m
∣
n
m
2
g
2
(
n
)
=
∑
m
∣
n
∑
d
∣
m
d
∗
φ
(
m
d
)
g_1(n) = \sum_{m|n}m^2 \qquad g_2(n)=\sum_{m|n}\sum_{d|m}d*\varphi(\frac{m}{d})
g1(n)=m∣n∑m2g2(n)=m∣n∑d∣m∑d∗φ(dm)
可以发现的是
g
1
(
n
)
g_1(n)
g1(n)和
g
2
(
n
)
g_2(n)
g2(n)都是积性函数 (不是完全积性函数)。
那么满足
g
(
n
)
=
∏
i
=
0
c
g
(
p
i
k
i
)
n
=
p
0
k
0
.
p
1
k
1
.
.
.
p
c
k
c
g(n) = \prod_{i=0}^{c}{g(p_i^{k_i})}\quad n=p_0^{k_0}.p_1^{k_1}...p_{c}^{k_{c}}
g(n)=∏i=0cg(piki)n=p0k0.p1k1...pckc
g
1
(
n
)
=
∏
i
=
0
c
g
1
(
p
i
k
i
)
g_1(n) = \prod _{i=0}^{c}g_1(p_i^{k_i})
g1(n)=i=0∏cg1(piki)
g
2
(
n
)
=
∏
i
=
0
c
g
2
(
p
i
k
i
)
g_2(n) = \prod_{i=0}^{c}g_2(p_i^{k_i})
g2(n)=i=0∏cg2(piki)
其实对于求解
g
(
p
k
)
g(p^k)
g(pk)就变得简单了。
因为
p
k
p^k
pk只有
k
+
1
k+1
k+1个因子
p
0
,
p
1
,
p
2
,
.
.
.
,
p
k
p^0,p^1,p^2,...,p^k
p0,p1,p2,...,pk。
于是只有分解质因数的复杂度了。
g
1
(
p
k
)
=
∑
m
∣
n
m
2
=
∑
i
=
0
k
(
p
2
i
)
g_1(p^k) =\sum_{m|n}m^2 =\sum_{i=0}^{k}(p^{2i})
g1(pk)=m∣n∑m2=i=0∑k(p2i)
g
2
(
p
k
)
=
∑
m
∣
n
∑
d
∣
m
d
∗
φ
(
m
d
)
=
∑
i
=
0
k
[
p
i
+
∑
j
=
1
i
(
p
j
−
p
j
−
1
)
∗
p
i
−
j
]
g_2(p^k) = \sum_{m|n}\sum_{d|m}d*\varphi(\frac{m}{d}) = \sum_{i=0}^{k}[p^i+\sum_{j=1}^{i}(p^j-p^{j-1})*p^{i-j}]
g2(pk)=m∣n∑d∣m∑d∗φ(dm)=i=0∑k[pi+j=1∑i(pj−pj−1)∗pi−j]
注:
φ
(
p
k
)
=
p
k
−
p
k
−
1
\color{red}\varphi(p^k) = p^k - p^{k-1}
φ(pk)=pk−pk−1,上式子读者可手推便可以发现。
=
∑
i
=
0
k
p
i
+
∑
i
=
0
k
∑
j
=
1
i
(
p
−
1
)
∗
p
j
−
1
∗
p
i
−
j
=\sum_{i=0}^{k}p^i+\sum_{i=0}^{k}\sum_{j=1}^{i}(p-1)*p^{j-1}*p^{i-j}
=i=0∑kpi+i=0∑kj=1∑i(p−1)∗pj−1∗pi−j
=
∑
i
=
0
k
p
i
+
∑
i
=
0
k
∑
j
=
1
i
(
p
−
1
)
∗
p
i
−
1
=\sum_{i=0}^{k}p^i+\sum_{i=0}^{k}\sum_{j=1}^{i}(p-1)*p^{i-1}
=i=0∑kpi+i=0∑kj=1∑i(p−1)∗pi−1
=
∑
i
=
0
k
p
i
+
∑
i
=
0
k
i
∗
(
p
−
1
)
∗
p
i
−
1
=\sum_{i=0}^{k}p^i+\sum_{i=0}^{k}i*(p-1)*p^{i-1}
=i=0∑kpi+i=0∑ki∗(p−1)∗pi−1
=
∑
i
=
0
k
p
i
+
p
−
1
p
∑
i
=
0
k
i
∗
p
i
=\sum_{i=0}^{k}p^i+\frac{p-1}{p}\sum_{i=0}^{k}i*p^i
=i=0∑kpi+pp−1i=0∑ki∗pi
=
∑
i
=
0
k
p
i
+
∑
i
=
0
k
i
∗
p
i
−
∑
i
=
0
k
i
∗
p
i
−
1
=\sum_{i=0}^{k}p^i+\sum_{i=0}^{k}i*p^i-\sum_{i=0}^{k}i*p^{i-1}
=i=0∑kpi+i=0∑ki∗pi−i=0∑ki∗pi−1
=
∑
i
=
0
k
(
i
+
1
)
∗
p
i
−
∑
i
=
0
k
i
∗
p
i
−
1
=\sum_{i=0}^{k}(i+1)*p^i-\sum_{i=0}^{k}i*p^{i-1}
=i=0∑k(i+1)∗pi−i=0∑ki∗pi−1
=
∑
i
=
1
k
+
1
i
∗
p
i
−
1
−
∑
i
=
0
k
i
∗
p
i
−
1
=\sum_{i=1}^{k+1}i*p^{i-1}-\sum_{i=0}^{k}i*p^{i-1}
=i=1∑k+1i∗pi−1−i=0∑ki∗pi−1
=
(
k
+
1
)
∗
p
k
−
0
=
(
k
+
1
)
∗
p
k
=(k+1)*p^k-0 = (k+1)*p^k
=(k+1)∗pk−0=(k+1)∗pk
综上
g
1
(
n
)
=
∏
i
=
0
c
g
1
(
p
i
k
i
)
=
∏
i
=
0
c
∑
j
=
0
k
i
(
p
i
2
j
)
g_1(n) = \prod_{i=0}^{c}g_1(p_i^{k_i})=\prod_{i=0}^{c}\sum_{j=0}^{k_i}(p_{i}^{2j})
g1(n)=i=0∏cg1(piki)=i=0∏cj=0∑ki(pi2j)
g
2
(
n
)
=
∏
i
=
0
c
g
2
(
p
i
k
i
)
=
∏
i
=
0
c
(
k
i
+
1
)
p
i
k
i
g_2(n) = \prod_{i=0}^{c}g_2(p_i^{k_i}) =\prod_{i=0}^{c}(k_i+1)p_i^{k_i}
g2(n)=i=0∏cg2(piki)=i=0∏c(ki+1)piki
Code
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
typedef unsigned long long ll;
int prime[maxn];
inline void getPrime() {
memset(prime,0,sizeof(prime));
prime[1] = 1;
for(int i=2;i<maxn;i++) {
if(!prime[i]) prime[++prime[0]] = i;
for(int j=1;j<=prime[0] && prime[j]*i < maxn;j++) {
prime[prime[j]*i] = 1;
if(i % prime[j] == 0) break;
}
}
}
void getFactors(int x) {
int tmp = x;
ll res = 1,ans = 1;
for(int i=1;i<=prime[0]&&prime[i]*prime[i]<=tmp;i++) {
if(tmp % prime[i] == 0) {
ll t1 = 1,t2 = 0,p = 1;
while(tmp % prime[i] == 0) {
tmp /= prime[i];
p = p * prime[i];
t1 = t1 + p * p;
t2++;
}
//printf("%llu %llu\n",t1,t2);
res = res * t1;
ans = ans * (t2 + 1) * p;
}
}
if(tmp != 1) {
res = res * ((ll)tmp * tmp + 1);
ans = ans * ((ll)2*tmp);
}
printf("%llu\n",res - ans);
}
int main()
{
getPrime();
int caset;scanf("%d",&caset);
int n;
while(caset--) {
scanf("%d",&n);
getFactors(n);
}
return 0;
}