ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1891 疯狂 LCM

2022-07-05 14:03:09  阅读:145  来源: 互联网

标签:ch frac gcd int sum P1891 疯狂 varphi LCM


P1891 疯狂 LCM

题意

给定 \(n\),求:

\[\sum_{i = 1}^n \operatorname{lcm}(i, n) \]

思路

先把 \(lcm\) 换成 \(gcd\):

\[\ n\sum_{i = 1}^n \frac{i}{gcd(i,n)} \]

加一个枚举因数的 \(\sum\)

\[\ n\sum_{d|n} \sum_{i = 1}^n \frac{i}{d}[gcd(i,n)=d] \]

\[\ n\sum_{d|n} \sum_{i = 1}^n \frac{i}{d}[gcd(\frac{i}{d},\frac{n}{d})=1] \]

用 \(i=\frac id\) 替换原本的 \(i\)

\[\ n\sum_{d|n} \sum_{i = 1}^{\frac nd} i[gcd(i,\frac{n}{d})=1] \]

由于 \(d,\frac{n}{d}\) 成对出现,可以用 \(d\) 替换 \(\frac{n}{d}\)

\[\ n\sum_{d|n} \sum_{i = 1}^{d} i[gcd(i,\frac{n}{d})=1] \]

可以发现这个式子与 \(\varphi(d)\) 有一定联系,因为

\[\varphi(d)=\sum_{i = 1}^{d} [gcd(i,\frac{n}{d})=1] \]

多了一个 \(i\)

一个小定理:若 \(gcd(a,b)=1\) \((a<b)\) 则 \(gcd(b-a,b)=1\)

因此原式可以两对两对的统计,可以写成

\[\ n\sum_{d|n} \sum_{i = 1}^{d} \varphi(d)\frac d2 \]

这样就可以计算了

注意 \(d=1\) 的时候特判

#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

const int N=1e6+5;

#define ll long long

int cnt;
int p[N],phi[N];
bool not_p[N];
ll f[N];

inline void get_phi(){
	phi[1]=1;
    not_p[1]=1;
	for(int i=2;i<N;++i){
		if(!not_p[i]){
			p[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=cnt&&i*p[j]<N;++j){
			not_p[i*p[j]]=1;
			if(i%p[j]==0){
				phi[i*p[j]]=phi[i]*p[j];
				break;
			}
			else
				phi[i*p[j]]=phi[i]*(p[j]-1);
		}
	}
	for(int i=1;i<N;++i)
		for(int j=1;j*i<N;++j)
			f[i*j]+=(i==1?1:1ll*phi[i]*i/2);
}

inline ll solve(int x){
	return f[x]*x;
}

signed main(){
	int T=read();
	get_phi();
	while(T--)
		cout<<solve(read())<<endl;
}

标签:ch,frac,gcd,int,sum,P1891,疯狂,varphi,LCM
来源: https://www.cnblogs.com/into-qwq/p/16446120.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有