BZOJ 2226: [Spoj 5971] LCMSum( 数论 )

∑lcm(i,n) = ∑ i*n/(i,n) = ∑d|n(x,n)=d x*n/d = ∑d|n(t,n/d)=1t*n = n∑d|nf(d). f(d)表示1~d中与d互质的数的和, 即f(d) = d*φ(d)/2(d>=2). 然后O(n)筛φ, 每次询问暴力算即可...最大是100w,sqrt(100w)=1000内的质数是168个, 所以复杂度是O(n + T*168), 可以AC

 ----------------------------------------------------------------------------------

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1000009;

bool check[maxn];

int prime[maxn], pn = 0, phi[maxn];

ll f[maxn];

void init() {

memset(check, 0, sizeof check);

for(int i = 2; i < maxn; i++) {

if(!check[i]) {

prime[pn++] = i;

f[i] = ll(i) * (phi[i] = i - 1) >> 1;

}

for(int j = 0; j < pn && i * prime[j] < maxn; j++) {

check[i * prime[j]] = 1;

if(i % prime[j]) {

phi[i * prime[j]] = phi[i] * (prime[j] - 1);

f[i * prime[j]] = ll(i) * prime[j] * phi[i * prime[j]] >> 1;

} else {

phi[i * prime[j]] = phi[i] * prime[j];

f[i * prime[j]] = ll(i) * prime[j] * phi[i * prime[j]] >> 1;

break;

}

}

}

}

void work(int n) {

if(n == 1) {

puts("1");

return;

} else if(n == 2) {

puts("4");

return;

} else if(n == 3) {

puts("12");

return;

}

ll ans = 0;

int m = (int)sqrt(n + 0.1);

for(int i = 1; i * i < n; i++) if(n % i == 0)

ans += f[i] + f[n / i];

if(m * m == n) ans += f[m];

printf("%lld\n", ans * n);

}

int main() {

init(); f[1] = 1;

int T; scanf("%d", &T);

while(T--) {

int n; scanf("%d", &n);

work(n);

}

return 0;

}

-----------------------------------------------------------------------------------

2226: [Spoj 5971] LCMSum

Time Limit: 20 Sec  Memory Limit: 259 MB
Submit: 886  Solved: 404
[Submit][Status][Discuss]

Description

Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes the Least Common Multiple of the integers i and n.

Input

The first line contains T the number of test cases. Each of the next T lines contain an integer n.

Output

Output T lines, one for each test case, containing the required sum.

Sample Input

3
1
2
5

Sample Output

1
4
55

HINT

Constraints

1 <= T <= 300000
1 <= n <= 1000000

Source

时间: 2024-10-08 10:19:45

BZOJ 2226: [Spoj 5971] LCMSum( 数论 )的相关文章

BZOJ 2226: [Spoj 5971] LCMSum

Description 求\(\sum_{i=1}^n[i,n],n\leqslant 10^6,T\leqslant 3\times 10^5\) Solution 数论.. \(\sum_{i=1}^n[i,n]\) \(=n\sum_{i=1}^n\frac{i}{(i,n)}\) \(=n\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}[(i,\frac{n}{d})=1]i\) 后面这个其实可以直接算出来 \(\sum_{i=1}^n[(i,n)=1]i=\sum_

【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)

[BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes the Least Common Multiple of the integers i and n. Input The first line contains T the number of test cases. Each of the n

bzoj2226[Spoj 5971] LCMSum

题目大意:给定T(10^5)组数据,每次给出n(10^6),求lcm(i,n){1<=i<=n}的和 一眼看上去就是一道数学题--蒟蒻数学太差思路略微诡异--我想着能不能nlogn直接把所有答案算出来,然后yy了一下-- 设F[n]为所求的值,f[n]为小于n的质数的和,我们考虑到lcm(a,b)=ab/gcd(a,b),那么我们可以去枚举gcd,对于一个n的因数d,在1到n中和n最大公因数为d的数对于F[n]的贡献就显而易见了,即F[n]+=n*d*f[n/d],这样可以nlogn求出 对于

[SPOJ 5971] LCMSum 莫比乌斯反演

题意 $t$ 组询问, 每组询问给定 $n$ , 求 $\sum_{k = 1} ^ n [n, k]$ . $t \le 300000, n \le 1000000$ . 一些常用的式子以及证明 $\phi(n) = \sum_{d = 1} ^ n [(d, n) = 1]$ . 说明 用数学语言进行描述不大于 $n$ 的与 $n$ 互质的数的个数. $n = \sum_{d | n} phi(d)$ . 证明 对分数 $\frac{i}{n} , 1 \le i \le n$ 的个数算两次

「SPOJ5971」 LCMSUM - 数论数学

题目描述 求 \(\sum_{i=1}^nlcm(i,n)\) \(T\) 组数据 \(1\le T\le 300000\) \(1\le n\le 1000000\) 链接 bzoj 2226 luogu SP5971 题解 算法1(暴力) 直接暴力枚举 \(i\) ,计算 \(lcm\) 时间复杂度 \(O(Tnlogn)\) 算法2 (数论) 先不管最后一个,就变成了这个: \[ \sum_{i=1}^{n-1}lcm(i,n) \] 将 \(lcm\) 转化为 \(gcd\): \[ A

BZOJ 1002 + SPOJ 104 基尔霍夫矩阵 + 一个递推式。

BZOJ 1002 高精度 + 递推 f[1] = 1; f[2] = 5; f[i] = f[i - 1] * 3 - f[i - 2] + 2; SPOJ 104 裸 + 不用Mod 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std;

【BZOJ】【2219】数论之神

中国剩余定理+原根+扩展欧几里得 题解:http://blog.csdn.net/regina8023/article/details/44863519 新技能get√: 1 LL Get_yuangen(LL p,LL phi){ 2 int c=0; 3 for(int i=2;i*i<=phi;i++) 4 if (phi%i==0) 5 f[++c]=i,f[++c]=phi/i; 6 for(int g=2;;g++){ 7 int j; 8 for(j=1;j<=c;j++) if

bzoj 2820 / SPOJ PGCD 莫比乌斯反演

那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j=1}^{m}[(i,j)=p]&=&\sum_{p=2}^{min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[i⊥j]\newline&=&\sum_{p=

BZOJ 2588: Spoj 10628. Count on a tree 主席树+lca

2588: Spoj 10628. Count on a tree Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. Input 第一行两个整数N,M. 第二行有N个整数,其中第i个整数表示点i的权值. 后面N-1行每行两个整数(x,y),表示点x到点y有一条边. 最后M行每行两个整数(u,v,k),表示一组询问.