【题解】GCDEX 系列

Version 1

UVA11417 GCD

Description

  • 多测, t t t 组数据。

  • 给定整数 n n n,求
    ∑ i = 1 n ∑ j = i + 1 n gcd ⁡ ( i , j ) \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) i=1nj=i+1ngcd(i,j)

  • 1 ≤ t ≤ 100 , 1 ≤ n ≤ 501 1\le t\le 100, 1\le n\le 501 1t100,1n501

Solution

O ( n 2 ) \Omicron(n^2) O(n2) 暴力。

Code

略。

Version 2

UVA11424 GCD - Extreme (I)

SP3871 GCDEX - GCD Extreme

UVA11426 拿行李(极限版) GCD - Extreme (II)

Description

  • 多测, t t t 组数据。

  • 给定整数 n n n,求
    ∑ i = 1 n ∑ j = i + 1 n gcd ⁡ ( i , j ) \sum_{i = 1}^n \sum_{j = i +1}^n \gcd(i, j) i=1nj=i+1ngcd(i,j)

  • 1 ≤ t ≤ 2 × 1 0 4 , 1 ≤ n ≤ 4 × 1 0 6 1\le t\le 2\times 10^4, 1\le n\le 4\times 10^6 1t2×104,1n4×106

Solution

∑ i = 1 n ∑ j = i + 1 n gcd ⁡ ( i , j ) = ∑ i = 1 n ∑ j = 1 n gcd ⁡ ( i , j ) − ∑ i = 1 n gcd ⁡ ( i , i ) 2 = ∑ i = 1 n ∑ j = 1 n gcd ⁡ ( i , j ) − ∑ i = 1 n i 2 \begin{aligned} \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) & = \dfrac{\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(i, j) - \sum\limits_{i = 1}^n \gcd(i, i)}{2} \\ & = \dfrac{\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(i, j) - \sum\limits_{i = 1}^n i}{2} \end{aligned} i=1nj=i+1ngcd(i,j)=2i=1nj=1ngcd(i,j)i=1ngcd(i,i)=2i=1nj=1ngcd(i,j)i=1ni

运用你丰富的莫反技巧,得到
∑ i = 1 n ∑ j = 1 n gcd ⁡ ( i , j ) = ∑ d = 1 n φ ( d ) ⌊ n d ⌋ 2 \sum_{i = 1}^n \sum_{j = 1}^n \gcd(i, j) = \sum_{d = 1}^n \varphi(d) \left\lfloor\dfrac{n}{d}\right\rfloor^2 i=1nj=1ngcd(i,j)=d=1nφ(d)dn2
线性筛 + 整除分块。

时间复杂度为 O ( n + t n ) \Omicron(n + t \sqrt{n}) O(n+tn )

T L E \rm TLE TLE


换一种方法:

f ( n ) = ∑ i = 1 n gcd ⁡ ( i , n ) f(n) = \sum_{i = 1}^n \gcd(i, n) f(n)=i=1ngcd(i,n),那么
∑ i = 1 n ∑ j = i + 1 n gcd ⁡ ( i , j ) = ∑ j = 1 n ∑ i = 1 j − 1 gcd ⁡ ( i , j ) = ∑ i = 1 n ∑ j = 1 i gcd ⁡ ( i , j ) − ∑ i = 1 n i = ∑ i = 1 n f ( i ) − n ⋅ ( n + 1 ) 2 \begin{aligned} \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) & = \sum_{j = 1}^n \sum_{i = 1}^{j - 1} \gcd(i, j) \\ & = \sum_{i = 1}^n \sum_{j = 1}^i \gcd(i, j) - \sum_{i = 1}^n i \\ & = \sum_{i = 1}^n f(i) - \dfrac{n \cdot (n +1)}{2} \end{aligned} i=1nj=i+1ngcd(i,j)=j=1ni=1j1gcd(i,j)=i=1nj=1igcd(i,j)i=1ni=i=1nf(i)2n(n+1)
又有
f ( n ) = ∑ i = 1 n gcd ⁡ ( i , n ) = ∑ d ∣ n ∑ i = 1 n d [ gcd ⁡ ( i , n ) = d ] = ∑ d ∣ n d ∑ i = 1 n d [ gcd ⁡ ( i , n d ) = 1 ] = ∑ d ∣ n d ⋅ φ ( n d ) = ∑ d ∣ n φ ( d ) ⋅ n d = ( φ ∗ Id ⁡ ) ( n ) \begin{aligned} f(n) & = \sum_{i = 1}^n \gcd(i, n) \\ & = \sum_{d \mid n} \sum_{i = 1}^n d[\gcd(i, n) = d] \\ & = \sum_{d \mid n} d \sum_{i = 1}^{\frac{n}{d}} \left[\gcd\left(i, \dfrac{n}{d} \right) = 1 \right] \\ & = \sum_{d \mid n} d \cdot \varphi\left(\dfrac{n}{d} \right) \\ & = \sum_{d \mid n} \varphi(d) \cdot \dfrac{n}{d} \\ & = (\varphi * \operatorname{Id})(n) \end{aligned} f(n)=i=1ngcd(i,n)=dni=1nd[gcd(i,n)=d]=dndi=1dn[gcd(i,dn)=1]=dndφ(dn)=dnφ(d)dn=(φId)(n)
由于 φ , Id ⁡ \varphi, \operatorname{Id} φ,Id 均为积性函数,因此 f f f 也为积性函数,可以线性筛(当然你可以 Θ ( n ln ⁡ n ) \Theta(n\ln n) Θ(nlnn) 算但是这不够好

n n n 分解质因数: n = ∏ i = 1 k p i α i n = \prod_{i = 1}^k p_i^{\alpha_i} n=i=1kpiαi,记录 β ( n ) = α 1 , γ ( n ) = p 1 α 1 \beta(n) = \alpha_1, \gamma(n) = p_1^{\alpha_1} β(n)=α1,γ(n)=p1α1

  • i ∈ P i\in \mathbb{P} iP f ( i ) = i + ( i − 1 ) = 2 i − 1 , β ( i ) = 1 , γ ( i ) = i f(i) = i + (i - 1) = 2i - 1, \beta(i) = 1, \gamma(i) = i f(i)=i+(i1)=2i1,β(i)=1,γ(i)=i

  • p j ∤ i p_j\nmid i pji f ( i ⋅ p j ) = f ( i ) ⋅ f ( p j ) , β ( i ⋅ p j ) = 1 , γ ( i ⋅ p j ) = p j f(i\cdot p_j) = f(i)\cdot f(p_j), \beta(i\cdot p_j) = 1, \gamma(i\cdot p_j) = p_j f(ipj)=f(i)f(pj),β(ipj)=1,γ(ipj)=pj

  • p j ∣ i p_j\mid i pji β ( i ⋅ p j ) = β ( i ) + 1 , γ ( i ⋅ p j ) = γ ( i ) ⋅ p j \beta(i\cdot p_j) = \beta(i) + 1, \gamma(i\cdot p_j) = \gamma(i) \cdot p_j β(ipj)=β(i)+1,γ(ipj)=γ(i)pj

    • γ ( i ) = i \gamma(i) = i γ(i)=i,即 i ⋅ p j = p k ( p ∈ P ) i\cdot p_j = p^k(p\in \mathbb{P}) ipj=pk(pP),其中 k = β ( i ⋅ p j ) k = \beta(i \cdot p_j) k=β(ipj),暴力算
      f ( p k ) = φ ( 1 ) ⋅ p k 1 + ∑ d ∣ p k , d > 1 φ ( d ) ⋅ p k d = p k ⋅ ∑ i = 1 k [ p i − 1 ( p − 1 ) ] ⋅ p k − i = p k ⋅ ∑ i = 1 k ( p i − p i − 1 ) ⋅ p k − i = p k ⋅ ∑ i = 1 k p k − p k − 1 = ( k + 1 ) p k − k ⋅ p k − 1 = [ β ( i ⋅ p j ) + 1 ] ( i ⋅ p j ) − β ( i ⋅ p j ) ⋅ i \begin{aligned} f(p^k) & = \varphi(1) \cdot \dfrac{p^k}{1} + \sum_{d\mid p^k, d > 1} \varphi(d) \cdot \dfrac{p^k}{d} \\ & = p^k \cdot \sum_{i = 1}^k [p^{i - 1}(p - 1)] \cdot p^{k - i} \\ & = p^k \cdot \sum_{i = 1}^k (p^i - p^{i - 1}) \cdot p^{k - i} \\ & = p^k \cdot \sum_{i = 1}^k p^k - p^{k - 1} \\ & = (k + 1) p^k - k \cdot p^{k - 1} \\ & = [\beta(i\cdot p_j) + 1](i\cdot p_j) - \beta(i\cdot p_j)\cdot i \end{aligned} f(pk)=φ(1)1pk+dpk,d>1φ(d)dpk=pki=1k[pi1(p1)]pki=pki=1k(pipi1)pki=pki=1kpkpk1=(k+1)pkkpk1=[β(ipj)+1](ipj)β(ipj)i

    • γ ( i ) ≠ i \gamma(i) \ne i γ(i)=i,此时 p j p_j pj i i i 的最小质因数。
      f ( i ⋅ p j ) = f { i γ ( i ) ⋅ [ p j ⋅ γ ( i ) ] } f(i \cdot p_j) = f\left\{\dfrac{i}{\gamma(i)} \cdot [p_j \cdot \gamma(i)] \right\} f(ipj)=f{γ(i)i[pjγ(i)]}
      此时 i i i 的所有质因数 p j p_j pj 都被除掉了, gcd ⁡ [ i γ ( i ) , p j ⋅ γ ( i ) ] = 1 \gcd\left[\dfrac{i}{\gamma(i)}, p_j \cdot \gamma(i) \right] = 1 gcd[γ(i)i,pjγ(i)]=1,由 f f f 是积性函数有
      f ( i ⋅ p j ) = f { i γ ( i ) ⋅ [ p j ⋅ γ ( i ) ] } = f [ i γ ( i ) ] ⋅ f [ p j ⋅ γ ( i ) ] f(i \cdot p_j) = f\left\{\dfrac{i}{\gamma(i)} \cdot [p_j \cdot \gamma(i)] \right\} = f\left[\dfrac{i}{\gamma(i)} \right] \cdot f[p_j \cdot \gamma(i)] f(ipj)=f{γ(i)i[pjγ(i)]}=f[γ(i)i]f[pjγ(i)]

综上,预处理 O ( n ) \Omicron(n) O(n),询问 Θ ( 1 ) \Theta(1) Θ(1),总时间复杂度为 O ( n + t ) \Omicron(n + t) O(n+t)

Code

// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;

const int MAXN = 1e6 + 5;
const int N = 1e6;

int p[MAXN], beta[MAXN], gamma[MAXN];
ll f[MAXN], sum[MAXN];
bool vis[MAXN];

void pre()
{
	f[1] = 1;
	for (int i = 2; i <= N; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			f[i] = 2 * i - 1;
			beta[i] = 1;
			gamma[i] = i;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= N; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				beta[i * p[j]] = beta[i] + 1;
				gamma[i * p[j]] = gamma[i] * p[j];
				if (gamma[i] == i)
				{
					f[i * p[j]] = (ll)(beta[i * p[j]] + 1) * (i * p[j]) - beta[i * p[j]] * i;
				}
				else
				{
					f[i * p[j]] = f[i / gamma[i]] * f[p[j] * gamma[i]];
				}
				break;
			}
			f[i * p[j]] = f[i] * f[p[j]];
			beta[i * p[j]] = 1;
			gamma[i * p[j]] = p[j];
		}
	}
	
	for (int i = 1; i <= N; i++)
	{
		sum[i] = sum[i - 1] + f[i];
	}
}

int main()
{
	pre();
	int n;
	while (scanf("%d", &n), n)
	{
		printf("%lld\n", sum[n] - (ll)n * (n + 1) / 2);
	}
	return 0;
}

Version 3

SP26045 GCDMAT2 - GCD OF MATRIX (hard)

Description

  • 多测, t t t 组数据。

  • 给定正整数 i 1 , i 2 , j 1 , j 2 i1, i2, j1, j2 i1,i2,j1,j2,求
    [ ∑ i = i 1 i 2 ∑ j = j 1 j 2 gcd ⁡ ( i , j ) ]   m o d   ( 1 0 9 + 7 ) \begin{aligned} \left[\sum_{i = i1}^{i2} \sum_{j = j1}^{j2} \gcd(i, j) \right] \bmod (10^9 +7) \end{aligned} [i=i1i2j=j1j2gcd(i,j)]mod(109+7)

  • t ≤ 5 × 1 0 4 , max ⁡ { i 2 } , max ⁡ { j 2 } ≤ 1 0 6 t\le 5\times 10^4, \max\{i2\}, \max\{j2\} \le 10^6 t5×104,max{i2},max{j2}106

Solution

容斥。


(不妨设   n ≤ m ) f ( n , m ) = ∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) = ∑ i = 1 n φ ( i ) ⌊ n i ⌋ ⌊ m i ⌋ \textsf{(不妨设 } n \le m \textsf{)} \begin{aligned} f(n, m) & = \sum_{i = 1}^n \sum_{j = 1}^m \gcd(i, j) \\ & = \sum_{i = 1}^n \varphi(i) \left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor \end{aligned} (不妨设 nmf(n,m)=i=1nj=1mgcd(i,j)=i=1nφ(i)inim


a n s = f ( i 2 , j 2 ) − f ( i 2 , j 1 − 1 ) − f ( i 1 − 1 , j 2 ) + f ( i 1 − 1 , j 1 − 1 ) ans = f(i2, j2) - f(i2, j1 - 1) - f(i1 - 1, j2) + f(i1 - 1, j1 - 1) ans=f(i2,j2)f(i2,j11)f(i11,j2)+f(i11,j11)
时间复杂度为 O ( n + t n ) \Omicron(n + t\sqrt{n}) O(n+tn )

你算了算 1 0 6 + 5 × 1 0 4 × 2 1 0 6 ≈ 1 0 8 10^6 + 5\times 10^4 \times 2\sqrt{10^6} \approx 10^8 106+5×104×2106 108,而时限 2.5 s 2.5s 2.5s,好像能过。

问题来了,你的整除分块做除法至少有 4 4 4 倍常数,而一次容斥又要做 4 4 4 次整除分块,总共是 16 16 16 倍大常数。

1 0 6 + 5 × 1 0 4 × 2 1 0 6 × 16 ≈ 1.6 × 1 0 9 10^6 + 5\times 10^4 \times 2\sqrt{10^6} \times 16 \approx 1.6\times 10^9 106+5×104×2106 ×161.6×109

额,终于知道为什么评黑了。


开始卡常。

  • Step  1 \text{Step } 1 Step 1:不用容斥,直接算
    a n s = ∑ i = 1 min ⁡ ( i 2 , j 2 ) φ ( i ) ( ⌊ i 2 i ⌋ − ⌊ i 1 − 1 i ⌋ ) ( ⌊ j 2 i ⌋ − ⌊ j 1 − 1 i ⌋ ) ans = \sum_{i = 1}^{\min(i2, j2)} \varphi(i) \left(\left\lfloor\dfrac{i2}{i}\right\rfloor - \left\lfloor\dfrac{i1 - 1}{i}\right\rfloor \right) \left(\left\lfloor\dfrac{j2}{i}\right\rfloor - \left\lfloor\dfrac{j1 - 1}{i}\right\rfloor \right) ans=i=1min(i2,j2)φ(i)(ii2ii11)(ij2ij11)
    这样整除分块变成 8 8 8 倍常数,但只用算一次。

  • Step  2 \text{Step } 2 Step 2:预处理 1 ∼ 1 0 6 1\sim 10^6 1106 的倒数,用 double 存应该够了。乘法比除法快。

  • Step  3 \text{Step } 3 Step 3:根号分治。

Code

代码中有一步 inv[i] = (1.0 / i) * EXP,其中 E X P = 1 0 − 10 EXP = 10^{-10} EXP=1010

原因是像 i = 3 i = 3 i=3 这样的会得到 i n v [ 3 ] = 0.333 ⋯ inv[3] = 0.333\cdots inv[3]=0.333,然后 3 × i n v [ 3 ] = 0.999 ⋯ 3 \times inv[3] = 0.999\cdots 3×inv[3]=0.999,下取整成了 0 0 0,所以要乘上 E X P EXP EXP 防止精度误差。

//18 = 9 + 9 = 18.
#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <bitset>
#include <cmath>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;

#define re register
#define il inline

namespace Fread
{
}
using Fread::read;

namespace Fwrite
{
}
using Fwrite::write;

const int MAXN = 1e6 + 5;
const int MOD = 1e9 + 7;
const double EXP = 1 + 1e-10;

int p[MAXN / 10], phi[MAXN], sum[MAXN];
bitset<MAXN> vis;
double inv[MAXN];

void pre(int n)
{
	phi[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			phi[i] = i - 1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				phi[i * p[j]] = phi[i] * p[j];
				break;
			}
			phi[i * p[j]] = phi[i] * phi[p[j]];
		}
	}
	for (int i = 1; i <= n; i++)
	{
		sum[i] = (sum[i - 1] + phi[i]) % MOD;
	}
	for (int i = 1; i <= n; i++)
	{
		inv[i] = (1.0 / i) * EXP;
	}
}

il int GetSum(int l, int r)
{
	return (sum[r] - sum[l - 1] + MOD) % MOD;
}

il int min2(int x, int y)
{
	return x < y ? x : y;
}

il int div2(int a, int b)
{
	if (b)
	{
		return (int)a * inv[b];
	}
	return 0x3f3f3f3f;
}

il void swap2(int &x, int &y)
{
	x ^= y ^= x ^= y;
}

int block(int i1, int i2, int j1, int j2)
{
	i1--, j1--;
	if (i2 > j2)
	{
		swap2(i1, j1);
		swap2(i2, j2);
	}
	int mid = sqrt(i2), res = 0;
	for (int i = 1; i <= mid; i++)
	{
		res = (res + (ll)phi[i] * (div2(i2, i) - div2(i1, i)) % MOD * (div2(j2, i) - div2(j1, i)) % MOD) % MOD;
	}
	for (int l = mid + 1, r; l <= i2; l = r + 1)
	{
		int k1 = div2(i1, l), k2 = div2(i2, l), k3 = div2(j1, l), k4 = div2(j2, l);
		r = min2(div2(i1, k1), min2(div2(i2, k2), min2(div2(j1, k3), div2(j2, k4))));
		res = (res + (ll)GetSum(l, r) * (k2 - k1) % MOD * (k4 - k3) % MOD) % MOD;
	}
	return res;
}

int main()
{
	int t = read(), n = read(), m = read();
	pre(max(n, m));
	while (t--)
	{
		int i1 = read(), j1 = read(), i2 = read(), j2 = read();
		write(block(i1, i2, j1, j2), '\n');
	}
	return 0;
}

Version4

SP19985 GCDEX2 - GCD Extreme (hard)

Description

  • 多测, t t t 组数据。

  • 给定整数 n n n,求出
    [ ∑ i = 1 n ∑ j = i + 1 n gcd ⁡ ( i , j ) ]   m o d   2 64 \left[\sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) \right] \bmod 2^{64} [i=1nj=i+1ngcd(i,j)]mod264

  • t ≤ 1 0 4 t\le 10^4 t104 1 ≤ n ≤ 235711131719 ≈ 2 × 1 0 11 1\le n\le 235711131719 \approx 2\times 10^{11} 1n2357111317192×1011

Solution

首先   m o d   2 64 \bmod 2^{64} mod264 就是开 unsigned long long \text{unsigned long long} unsigned long long 然后自然溢出。

Version 2 的方法要 O ( n ) \Omicron(n) O(n) 预处理,会废。


试着枚举 gcd ⁡ \gcd gcd
a n s = ∑ j = 1 n ∑ i = 1 j − 1 gcd ⁡ ( i , j ) = ∑ i = 1 n ∑ j = 1 i gcd ⁡ ( i , j ) − ∑ i = 1 n i = ∑ d = 1 n ∑ i = 1 n ∑ j = 1 i d [ gcd ⁡ ( i , j ) = d ] − ∑ i = 1 n i = ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 i [ gcd ⁡ ( i , j ) = 1 ] − ∑ i = 1 n i = ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ φ ( i ) − ∑ i = 1 n i \begin{aligned} ans & = \sum_{j = 1}^n \sum_{i = 1}^{j - 1} \gcd(i, j) \\ & = \sum_{i = 1}^n \sum_{j = 1}^i \gcd(i, j) - \sum_{i = 1}^n i \\ & = \sum_{d = 1}^n \sum_{i = 1}^n \sum_{j = 1}^i d [\gcd(i, j) = d] -\sum_{i = 1}^n i \\ & = \sum_{d = 1}^n d \sum_{i = 1}^{\left\lfloor\frac{n}{d}\right\rfloor} \sum_{j = 1}^i [\gcd(i, j) = 1] - \sum_{i = 1}^n i \\ & = \sum_{d = 1}^n d \sum_{i = 1}^{\left\lfloor\frac{n}{d}\right\rfloor} \varphi(i) - \sum_{i = 1}^n i \end{aligned} ans=j=1ni=1j1gcd(i,j)=i=1nj=1igcd(i,j)i=1ni=d=1ni=1nj=1id[gcd(i,j)=d]i=1ni=d=1ndi=1dnj=1i[gcd(i,j)=1]i=1ni=d=1ndi=1dnφ(i)i=1ni
前面一项把杜教筛扔到整除分块里就 O ( n 2 3 + n ) ≃ O ( n 2 3 ) \Omicron(n^{\frac{2}{3}} + \sqrt{n}) \simeq \Omicron(n^{\frac{2}{3}}) O(n32+n )O(n32) 做完了。

别紧张时限有 20 s 20s 20s

注意在 Version 2 中不要用杜教筛因为 n n n 太小然后杜教筛常数太大。

Code

// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#include <unordered_map>
#define Debug(x) cout << #x << "=" << x << endl
#define int unsigned long long
using namespace std;

const int MAXN = 21544346 + 5;
const int N = 21544346;

int p[MAXN], phi[MAXN], sum[MAXN];
bool vis[MAXN];

void pre()
{
	phi[1] = sum[1] = 1;
	for (int i = 2; i <= N; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			phi[i] = i - 1;
		}
		sum[i] = sum[i - 1] + phi[i];
		for (int j = 1; j <= p[0] && i * p[j] <= N; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				phi[i * p[j]] = phi[i] * p[j];
				break;
			}
			phi[i * p[j]] = phi[i] * phi[p[j]];
		}
	}
}

int S(int n)
{
	if (n % 2 == 0)
	{
		return n / 2 * (n + 1);
	}
	return (n + 1) / 2 * n;
}

unordered_map<int, int> dp;

int sublinear(int n)
{
	if (n <= N)
	{
		return sum[n];
	}
	if (dp.count(n))
	{
		return dp[n];
	}
	int res = S(n);
	for (int l = 2, r; l <= n; l = r + 1)
	{
		int k = n / l;
		r = n / k;
		res -= (r - l + 1) * sublinear(k);
	}
	return dp[n] = res;
}

int GetSum(int l, int r)
{
	return S(r) - S(l - 1);
}

int block(int n)
{
	int res = 0;
	for (int l = 1, r; l <= n; l = r + 1)
	{
		int k = n / l;
		r = n / k;
		res += GetSum(l, r) * sublinear(k);
	}
	return res;
}

signed main()
{
	pre();
	int t;
	scanf("%llu", &t);
	while (t--)
	{
		int n;
		scanf("%llu", &n);
		printf("%llu\n", block(n) - S(n));
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值