「SPOJ 5971」LCMSUM

题目链接:https://www.luogu.org/problemnew/show/SP5971


Description

  求解(多组数据)

Answer=i=1nlcm(i,n) A n s w e r = ∑ i = 1 n lcm ( i , n )

   1T3×105 1 ⩽ T ⩽ 3 × 10 5 1n106 1 ⩽ n ⩽ 10 6


Solution

  易得原式即

i=1ningcd(i,n) ∑ i = 1 n i ⋅ n gcd ( i , n )

  根据 gcd(a,n)=1 gcd ( a , n ) = 1 时一定有 gcd(na,n)=1 gcd ( n − a , n ) = 1 ,可将原式化为

12(i=1n1ingcd(i,n)+i=n11ingcd(i,n))+n 1 2 ⋅ ( ∑ i = 1 n − 1 i ⋅ n gcd ( i , n ) + ∑ i = n − 1 1 i ⋅ n gcd ( i , n ) ) + n

  上述式子中括号内的两个 对应的项相等,故又可以化为

12i=1n1n2gcd(i,n)+n 1 2 ⋅ ∑ i = 1 n − 1 n 2 gcd ( i , n ) + n

  可以将相同的 gcd(i,n) gcd ( i , n ) 合并在一起计算,故只需要统计 gcd(i,n)=d gcd ( i , n ) = d 的个数。当 gcd(i,n)=d gcd ( i , n ) = d 时, gcd(id,nd)=1 gcd ( i d , n d ) = 1 ,所以 gcd(i,n)=d gcd ( i , n ) = d 的个数有 φ(nd) φ ( n d ) 个。

  故答案为

12d|nn2φ(nd)d+n 1 2 ⋅ ∑ d | n n 2 ⋅ φ ( n d ) d + n

  变换求和顺序,设 d=nd d ′ = n d ,式子化为

12nd|ndφ(d)+n 1 2 n ⋅ ∑ d ′ | n d ′ ⋅ φ ( d ′ ) + n

  设 g(n)=d|ndφ(d) g ( n ) = ∑ d | n d ⋅ φ ( d ) ,已知 g g 为积性函数,于是可以 Θ(n) Θ ( n ) 预处理。最后枚举 d d ,统计贡献即可。

  时间复杂度Θ(nlogn)


Code

#include <cstdio>
const int N=1000000;
int tot,p[N+5],phi[N+5];
long long ans[N+5];
bool flg[N+5];

void solve() {
    phi[1]=1;
    for(int i=2;i<=N;++i) {
        if(!flg[i]) p[++tot]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&i*p[j]<=N;++j) {
            flg[i*p[j]]=1;
            if(i%p[j]==0) {
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    }
    for(int i=1;i<=N;++i) {
        for(int j=1;i*j<=N;++j) {
            ans[i*j]+=1LL*j*phi[j]/2;
        }
    }
    for(int i=1;i<=N;++i) ans[i]=1LL*i*ans[i]+i;
}
int main() {
    int T,n;
    solve();
    for(scanf("%d",&T);T;--T) {
        scanf("%d",&n);
        printf("%lld\n",ans[n]);
    }
    return 0;
}
洛谷的SPOJ需要注册一个SPOJ账号并进行绑定才能进行交题。您可以按照以下步骤进行注册: 1. 打开洛谷网站(https://www.luogu.com.cn/)并登录您的洛谷账号。 2. 在网站顶部导航栏中找到“题库”选项,将鼠标悬停在上面,然后选择“SPOJ”。 3. 在SPOJ页面上,您会看到一个提示,要求您注册SPOJ账号并进行绑定。点击提示中的链接,将会跳转到SPOJ注册页面。 4. 在SPOJ注册页面上,按照要求填写您的用户名、密码和邮箱等信息,并完成注册。 5. 注册完成后,返回洛谷网站,再次进入SPOJ页面。您会看到一个输入框,要求您输入刚刚注册的SPOJ用户名。输入用户名后,点击“绑定”按钮即可完成绑定。 现在您已经成功注册并绑定了SPOJ账号,可以开始在洛谷的SPOJ题库上刷题了。祝您顺利完成编程练习!\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [(洛谷入门系列,适合洛谷新用户)洛谷功能全解](https://blog.csdn.net/rrc12345/article/details/122500057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [luogu p7492 序列](https://blog.csdn.net/zhu_yin233/article/details/122051384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值