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,吼吼。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. const int maxn = 1e6+;
  9. int opl[maxn];
  10. void init()
  11. {
  12. for(int i=;i<maxn;i++) opl[i] = i;
  13. for(int i=;i<maxn;i++)
  14. {
  15. if(opl[i]==i) opl[i] = i-;
  16. else continue;
  17. for(int j=i+i;j<maxn;j=j+i)
  18. opl[j] = opl[j]/i*(i-);
  19. }
  20. }
  21. int main()
  22. {
  23. int T;
  24. LL n;
  25. init();
  26. scanf("%d",&T);
  27. while(T--)
  28. {
  29. scanf("%lld",&n);
  30. LL sum = ;
  31. for(LL i=;i*i<=n;i++)
  32. {
  33. if(n%i==)
  34. {
  35. if(i!=n)
  36. sum = sum + (n/i)*(opl[n/i]*n/);
  37. LL tmp = n/i;
  38. if(tmp!=i && tmp!=n)
  39. sum = sum + i*(opl[i]*n/);
  40. }
  41. }
  42. printf("%lld\n",sum+n);
  43. }
  44. return ;
  45. }

这样的话,是不行了。

原始相当于

也就能转化为(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。

代码:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. const int maxn = 1e6+;
  9. LL opl[maxn];
  10. LL g[maxn];
  11. void init()
  12. {
  13. for(int i=;i<maxn;i++) opl[i] = i;
  14. //这种方法筛选素数,不用和以前一样要先刷素数,还开num[];
  15. for(int i=;i<maxn;i++)
  16. {
  17. if(opl[i]==i)
  18. opl[i] = i-;
  19. else continue;
  20. for(int j=i+i;j<maxn;j=j+i)
  21. opl[j] = opl[j]/i*(i-);
  22. }
  23. for(int i=;i<maxn;i++){
  24. opl[i] = opl[i]*i/;
  25. g[i] = opl[i];
  26. }
  27. for(long long i=;i<=;i++) //这里的i 不能用int,肯定会超int的
  28. {
  29. for(long long j=i*i,k=i;j<maxn;j=j+i,k++)
  30. if(i!=k) //不重复
  31. g[j] = g[j] + opl[i]+opl[k];
  32. else g[j] = g[j] + opl[i];
  33. }
  34. }
  35. int main()
  36. {
  37. init();
  38. int T;
  39. LL n;
  40. scanf("%d",&T);
  41. while(T--)
  42. {
  43. scanf("%lld",&n);
  44. printf("%lld\n",g[n]*n+n);
  45. }
  46. return ;
  47. }

spoj LCMSUM sigma(lcm(i,n));的更多相关文章

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

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

  3. (转载)有关反演和gcd

    tips : 积性函数 F (n) = Π F (piai ) 若F (n), G (n)是积性函数则 F (n) * G (n) Σd | n F (n) 是积性函数 n = Σd | n  φ ( ...

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

  5. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  6. bzoj 2693: jzptab 线性筛积性函数

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discus ...

  7. 【莫比乌斯反演】BZOJ2154 Crash的数字表格

    Description 求sigma lcm(x,y),x<=n,y<=m.n,m<=1e7. Solution lcm没有什么直接做的好方法,用lcm=x*y/gcd转成gcd来做 ...

  8. 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. 于是把原串和原串扩大两倍 ...

  9. BZOJ2226: [Spoj 5971] LCMSum

    题解: 考虑枚举gcd,然后问题转化为求<=n且与n互质的数的和. 这是有公式的f[i]=phi[i]*i/2 然后卡一卡时就可以过了. 代码: #include<cstdio> # ...

随机推荐

  1. Python之urllib2

    urllib2 - extensible library for opening URLs Note The urllib2 module has been split across several ...

  2. Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)

    一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...

  3. 认识javascript

    javascript小知识 www.phonegap.com(跨平台开发框架) Cocos2d-Html5(WebGL渲染  javascript语言) creatjs.com(融合了flash动画的 ...

  4. C++之路进阶——poj2104(K-th Number)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 44537   Accepted: 14781 Ca ...

  5. C++之路起航——标准模板库(deque)

    deque(双端队列):http://baike.baidu.com/link?url=JTvA2cuLubptctHZwFxswvlZvxNdFOxmifsYCGLj5IZF-Tj4rbWLv8Jn ...

  6. flot_js_$用法解释

    $用法解释 $在JS中本身只是一个符号而异,在JS里什么也不是.但在JS应用库JQUERY的作者将之做为一个自定义函数名了,这个函数是获取指定网页元素的函数,使用非常之频繁,所以好多新手不知道,还以为 ...

  7. 怎么查看windows2003中隐藏用户

    在命令模式下删除1.你在MS-dos下先输入net user 看有那些用户, 注意第一步看不出隐藏的用户 2.然后在输入net localgroup administrators 或者 net loc ...

  8. Mysql索引总结(一)

    数据库开发中索引的使用占了很重要的位置,好的索引会使数据库的读写效率加倍,烂的索引则会拖累整个系统甚至引发灾难. 索引分三类: index ----普通的索引,数据可以重复 unique ----唯一 ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON ClipRegion

    zw版[转发·台湾nvp系列Delphi例程]HALCON ClipRegion procedure TForm1.Button1Click(Sender: TObject);var img : HI ...

  10. 【sinatra】安装测试

    $ gem install sinatra 测试: $ subl app.rb app.rb内容: require 'sinatra' get '/' do "Hello, World!&q ...