SPOJ (BNUOJ) LCM Sum

本文探讨了LCMSum问题的求解方法,通过优化欧拉函数的计算过程,提出了一个高效的算法来解决LCMSum问题。文章详细介绍了算法的设计思路、复杂度分析以及通过实例展示算法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LCM Sum


Time Limit: 5000 ms     Case Time Limit: 5000 ms     Memory Limit: 262144 KB
Submit: 4     Accepted: 0
This problem will be judged on SPOJ. Original ID: LCMSUM.
 
  

[Prev][Next]

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.

Example

Sample Input :
3
1
2
5

Sample Output :
1
4
55


Constraints

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

 
  

Input


Output


Sample Input

Sample Output

Source

own problem used for Codechef Snackdown Onsite
卡时卡的好紧

//思路 欧拉函数
gcd(i,n)=k 求出所有的这样i的和 n*(phi[n/k]*(n/k)/2)*k
lcm(i,n)=i*n/k; 所以 所有这样的i sigma(lcm(i,n))=n*[n*(phi[n/k]*(n/k)/2)8k]/k
整理得 n*n*phi[n/k]/2/k 然后sqrt(n) 时间复杂度是 预处理欧拉函数时间+Qsqrt(N),这个超时、、、
然后再整理,(i|n) sigma(lcm(i,n))=n*(n/k)*phi[n/k]/2; 把n/k 看成a 则 =n*a*phi[a]/2
这样就可以预处理所有的 lcm(i,N) 1<=i<=N 值, 输出直接是O(1);
//
超时代码
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000001
int phi[N];
#define __int64 long long
void set()//求欧拉函数
{
    int i,j;
    for(i=2;i<N;i++)
      if(i%2)
        phi[i]=i;
      else
        phi[i]=i/2;
    for(i=3;i<N;i+=2)
     if(phi[i]==i)
       for(j=i;j<N;j+=i)
        phi[j]=phi[j]/i*(i-1);
}
int main()
{
    set();
    int T;
    int m;
    __int64 n;
    __int64 sum;
    scanf("%d",&T);
    int i;
    while(T--)
    {
        scanf("%lld",&n);
        if(n==1) { printf("1\n");continue; }
        m=sqrt((double)n);
        sum=n*n*phi[n]/2;
        for(i=2;i<=m;i++)
         if(n%i==0)
         {
             sum+=n*n*phi[n/i]/2/i;
             if(i*i<n)
             {
                 sum+=n*n*phi[i]/2/(n/i);
             }
         }
         sum+=n;
        printf("%lld\n",sum);

    }
    return 0;
}




AC 代码

#include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <algorithm> using namespace std; #define N 1000001 #define __int64 long long __int64 phi[N]; __int64 ans[N]; void set() { __int64 i,j; for(i=2;i<N;i++) if(i%2) phi[i]=i; else phi[i]=i/2; for(i=3;i<N;i+=2) if(phi[i]==i) for(j=i;j<N;j+=i) phi[j]=phi[j]/i*(i-1); ans[1]=1; for(i=2;i<N;i++) ans[i]=i*phi[i]/2+1; __int64 k;//开始变量定义成int 计算过程中导致超过 int范围 for(i=2;i<=1000;i++) { ans[i*i]+=i*phi[i]/2; for(j=i*i+i,k=i+1;j<N;j+=i,k++) ans[j]+=i*phi[i]/2+k*phi[k]/2; } } int main() { set(); int T; int n; scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%lld\n",ans[n]*n); } return 0; }

转载于:https://www.cnblogs.com/372465774y/archive/2012/10/25/2740066.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值