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 an integer n.
Output
Output T lines, one for each test case, containing the required sum.
Example
Sample Input :
3
1
2
5
Sample Output :
1
4
55
Constraints
1 <= T <= 300000
1 <= n <= 1000000
题意:sigma(lcm(i,n)) ; 1<=i<=n
思路:题意倒是很简单,有类似的题目sigma(gcd(i,n)) ;1<=i<=n;
一看就是果然是同类型的。
gcd(i,n)的题目 http://www.cnblogs.com/tom987690183/p/3247439.html
这个是求lcm()最小公倍数.
同样的思路,我们枚举gcd() = d 则在[ 1 , n ]中与n最大公约数为d的值有euler(n/d)个.
这些数的和为euler(n/d)*n/2; 我们知道lcm = x*n/(gcd(x,n)) = > x*n/d ;
因为与n gcd() = d的数字为x1,x2,x3....
根据lcm = x*n/(gcd(x,n)) 可以得到 (n/d)*(x1+x2+x3...) => [euler(n/d)*n/2]*(n*d);
这里需要注意的是当gcd(i,n) = n的时候,用euler(n)*n/2算的时候是不对的,就特判吧。
这样的思路,我们就可以试一下打欧拉表opl[ ],需要时间o(N);
然后对于n,要用sqrt(n)的时间。
T*sqrt(n)+o(N) = 3^8+10^6.果断超时。以为能ac,吼吼。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL; const int maxn = 1e6+;
int opl[maxn];
void init()
{
for(int i=;i<maxn;i++) opl[i] = i;
for(int i=;i<maxn;i++)
{
if(opl[i]==i) opl[i] = i-;
else continue;
for(int j=i+i;j<maxn;j=j+i)
opl[j] = opl[j]/i*(i-);
}
}
int main()
{
int T;
LL n;
init();
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
LL sum = ;
for(LL i=;i*i<=n;i++)
{
if(n%i==)
{
if(i!=n)
sum = sum + (n/i)*(opl[n/i]*n/);
LL tmp = n/i;
if(tmp!=i && tmp!=n)
sum = sum + i*(opl[i]*n/);
}
}
printf("%lld\n",sum+n);
}
return ;
}
这样的话,是不行了。
原始相当于
也就能转化为(easy)
这样的话,我们就能单独的求出euler(a)*a/2;然后用它来筛选g[n]的值。
(x|n的意思代表 n是x的倍数)
我们想到在第一种方法里,我们用sqrt(n)来求它的因子的方法。
同理,逆向一下就好。
这样我们只需要o(N) 的时间对g[]进行筛选。总的预处理时间
3*o(N) = > 3*10^6;
完毕。
需要注意的是,我们没有把gcd() = n的情况包含进去,所以最后要+n。
代码:
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL; const int maxn = 1e6+;
LL opl[maxn];
LL g[maxn];
void init()
{
for(int i=;i<maxn;i++) opl[i] = i;
//这种方法筛选素数,不用和以前一样要先刷素数,还开num[];
for(int i=;i<maxn;i++)
{
if(opl[i]==i)
opl[i] = i-;
else continue;
for(int j=i+i;j<maxn;j=j+i)
opl[j] = opl[j]/i*(i-);
}
for(int i=;i<maxn;i++){
opl[i] = opl[i]*i/;
g[i] = opl[i];
}
for(long long i=;i<=;i++) //这里的i 不能用int,肯定会超int的
{
for(long long j=i*i,k=i;j<maxn;j=j+i,k++)
if(i!=k) //不重复
g[j] = g[j] + opl[i]+opl[k];
else g[j] = g[j] + opl[i];
}
}
int main()
{
init();
int T;
LL n;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
printf("%lld\n",g[n]*n+n);
}
return ;
}
spoj LCMSUM sigma(lcm(i,n));的更多相关文章
- SPOJ LCMSUM - LCM Sum
题意是求: $\sum_{i = 1}^{n}lcm(i, n)$ $= \sum_{i = 1}^{n}\frac{ni}{gcd(i, n)}$ $= n\sum_{i = 1}^{n}\frac ...
- SPOJ LGLOVE 7488 LCM GCD Love (区间更新,预处理出LCM(1,2,...,n))
题目连接:http://www.spoj.com/problems/LGLOVE/ 题意:给出n个初始序列a[1],a[2],...,a[n],b[i]表示LCM(1,2,3,...,a[i]),即1 ...
- (转载)有关反演和gcd
tips : 积性函数 F (n) = Π F (piai ) 若F (n), G (n)是积性函数则 F (n) * G (n) Σd | n F (n) 是积性函数 n = Σd | n φ ( ...
- 51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3
1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N ...
- Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...
- bzoj 2693: jzptab 线性筛积性函数
2693: jzptab Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 444 Solved: 174[Submit][Status][Discus ...
- 【莫比乌斯反演】BZOJ2154 Crash的数字表格
Description 求sigma lcm(x,y),x<=n,y<=m.n,m<=1e7. Solution lcm没有什么直接做的好方法,用lcm=x*y/gcd转成gcd来做 ...
- 2011 Multi-University Training Contest 4 - Host by SDU
A.Color the Simple Cycle(polya计数+字符串匹配) 此题的难点在于确定置换的个数,由a[i+k]=a[i], e[i+k]=e[i]联想到KMP. 于是把原串和原串扩大两倍 ...
- BZOJ2226: [Spoj 5971] LCMSum
题解: 考虑枚举gcd,然后问题转化为求<=n且与n互质的数的和. 这是有公式的f[i]=phi[i]*i/2 然后卡一卡时就可以过了. 代码: #include<cstdio> # ...
随机推荐
- 【Origin】 画道
-夏之时,晚归途中,观云,感雨,识迷障,题以记之. 原道是东边日出西边雨, 却原来乌云蔽日雨不息; 只不过光芒也破云边洒, 可还是满地泥泞水花起. --作于二零一六年七月十一日
- zjuoj 3609 Modular Inverse
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3609 Modular Inverse Time Limit: 2 Seco ...
- c++之路进阶——codevs4543(普通平衡树)
4543 普通平衡树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...
- Spark朴素贝叶斯(naiveBayes)
朴素贝叶斯(Naïve Bayes) 介绍 Byesian算法是统计学的分类方法,它是一种利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯分类算法可以与决策树和神经网络分类算法想媲美,该算法能运 ...
- 《OpenGL着色语言》理解点记录三
“帧缓冲区”中的“帧”的含义? “帧”是连续图像中的一幅,3D可视化程序最终都是转化为一幅幅的图像输出在显示器上,这一幅幅的图像叫做叫“帧”. 解释“glBlendFunc(GL_SRC_AL ...
- :eq(index)
匹配一个给定索引值的元素 从 0 开始计数 查找第二行 HTML 代码: <table> <tr><td>Header 1</td></tr> ...
- java小程序整理及排序算法
1. 利用循环打印如下图形 ***** **** *** ** * public class Main { public static void main(String[] args) { // TO ...
- Javascript 类与静态类的实现-js面向对象
在Javascript里,对面向对象并没有一个直接的实现,对于代码方面也是非常的灵活. 今天所要说的就是,如何在Javascript里写类与静态类,这是本人一惯用的方法,你也可以有更为方便的,也可以发 ...
- ch2-4:遇到嵌套列表进行缩进打印
1.增加一个参数来控制缩进打印:level '''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list,level): ""&qu ...
- mmap DMA【转】
转自:http://blog.csdn.net/lihaoweiv/article/details/6275241 第 13 章 mmap 和 DMA 本章将深入探讨 Linux 内存管理部分,并强 ...