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

对于f[n]求法也非常的简单,可以看出f[n]=sigma(i*[gcd(i,n)=1]),再把[gcd(i,n)=1]写成莫比乌斯函数的形式,套路一样的重新组合啊什么的,最终就是可以变成这样的形式:f[n]+=u[k]*(k*((n/k)+1)(n/k)/2){k|n},也是可以在nlogn时间求出。

听说有根号大法……不过不会……数学太弱QAQ

为了避免常数被卡特意用C++写的

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int N=1000086;
 8 ll f[N],F[N],pri[N],vis[N],mu[N],tot;
 9 int read()
10 {
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 void getmu()
17 {
18     mu[1]=1;tot=0;
19     for(int i=2;i<=N;i++)
20     {
21         if(!vis[i]){pri[++tot]=i;mu[i]=-1;}
22         for(int j=1;j<=tot&&pri[j]*i<=N;j++)
23         {
24             vis[i*pri[j]]=1;
25             if(i%pri[j]==0){mu[pri[j]*i]=0;break;}
26             else mu[pri[j]*i]=-mu[i];
27         }
28     }
29 }
30 void getf()
31 {
32
33     for(int i=1;i<=N;i++)
34         for(int j=1;j*i<=N;j++)
35             f[i*j]+=mu[i]*((ll)i*(j+1)*j/2);
36 }
37 void getF()
38 {
39     for(int i=1;i<=N;i++)
40         for(int j=1;j*i<=N;j++)
41             F[i*j]+=f[j]*i*j;
42 }
43 int main()
44 {
45     getmu();getf();getF();
46     int T=read();
47     while(T--)
48     {
49         int n=read();printf("%lld\n",F[n]);
50     }
51     return 0;
52 }
时间: 2025-01-07 07:43:16

bzoj2226[Spoj 5971] LCMSum的相关文章

【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

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

[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 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][SPOJ5971]LCMSum(莫比乌斯反演)

2226: [Spoj 5971] LCMSum Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1949  Solved: 852[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 in

bzoj2226

http://blog.csdn.net/benjaminpmlee/article/details/44947809 有点暴力...因为cout而re了两发.. 1 #include<bits/stdc++.h> 2 #define lowbit(a) ((a)&(-(a))) 3 #define clr(a,x) memset(a,x,sizeof(a)) 4 #define rep(i,l,r) for(int i=l;i<(r);i++) 5 typedef long l

BZOJ 1363 最小公倍数之和

Description 求\(\sum_{i=1}^n[i,n],n\leqslant 10^9,T\leqslant 5\times 10^4\) Solution 数论+欧拉函数... 破题有毒... 推导和BZOJ 2226: [Spoj 5971] LCMSum一样... 但是需要枚举所有约数,同时统计一下\(\varphi\)... Code #include <bits/stdc++.h> using namespace std; typedef long long ll; con

一类欧拉函数相关的求和式推导

\(\\\) 写在前面 因为最近做了不少和欧拉函数相关的求和问题,而这一类求和的推导有没有涉及到反演和卷积,所以单独写一写. 给出的题目顺序与难度大致无关,是按照个人做题的顺序安排的. 再次声明欧拉函数的定义:\(\varphi(x)\) 表示 \([1,x]\) 里的所有整数中,与 \(x\) 互质的数的个数. 下面的叙述中均用 \((x,y)\) 表示 \(gcd(x,y)\) ,用 \([x,y]\) 表示 \(lcm(x,y)\) . \(\\\) 欧拉函数的两种常用求法 公式法,单点复

spoj LCMSUM sigma(lcm(i,n));

Problem code: LCMSUM 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