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_{i=1}^ni\sum_{d|i}[d|n]\mu(d)=\sum_{d|n}\mu(d)d\sum_{i=1}^{\frac{n}{d}}i\)

把后面那个式子求和,然后再xjb化一下,就会发现\(n=1\)时为\(1\),其他时候为\(\frac{n\varphi(n)}{2}\)..

然后用欧拉筛统计一下...

复杂度\(O(nloglogn)\)

Code

/**************************************************************
    Problem: 2226
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:7452 ms
    Memory:28632 kb
****************************************************************/

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 1000050;

int pr[N],cp;
int phi[N],b[N];
LL f[N],h[N];

void pre(int n) {
    for(int i=2;i<=n;i++) {
        if(!b[i]) pr[++cp]=i,phi[i]=i-1;
        for(int j=1;j<=cp && (LL)i*pr[j]<=n;j++) {
            b[i*pr[j]]=1;
            if(i%pr[j]) phi[i*pr[j]]=phi[i]*(pr[j]-1);
            else { phi[i*pr[j]]=phi[i]*pr[j];break; }
        }
    }
    f[1]=1;for(int i=2;i<=n;i++) f[i]=1LL*i*phi[i]/2;
    for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=i) h[j]+=f[i];
    for(int i=1;i<=n;i++) h[i]*=i;
//  for(int i=1;i<=n;i++) cout<<phi[i]<<" ";cout<<endl;
//  for(int i=1;i<=n;i++) cout<<f[i]<<" ";cout<<endl;
//  for(int i=1;i<=n;i++) cout<<h[i]<<" ";cout<<endl;
}
int T,n;

int main() {
    for(pre(1000000),scanf("%d",&T);T--;)
        scanf("%d",&n),printf("%lld\n",h[n]);
    return 0;
}

  

时间: 2024-08-04 07:13:06

BZOJ 2226: [Spoj 5971] LCMSum的相关文章

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  ----------------------------------------------

【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$ 的个数算两次

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 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),表示一组询问.

bzoj 2482: [Spoj GSS2] Can you answer these queries II 线段树

2482: [Spoj1557] Can you answer these queries II Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 145  Solved: 76[Submit][Status][Discuss] Description 给定n个元素的序列. 给出m个询问:求l[i]~r[i]的最大子段和(可选空子段). 这个最大子段和有点特殊:一个数字在一段中出现了两次只算一次. 比如:1,2,3,2,2,2出现了3次,但只算一次,

bzoj 2588: Spoj 10628. Count on a tree LCA+主席树

2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. Input 第一行两个整数N,M. 第二行有N个整数,其中第i个整数