\(\color{#0066ff}{ 题目描述 }\)

众所周知,czmppppp是数学大神犇。一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了。。。

给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N)。

\(\color{#0066ff}{输入格式}\)

第一行一个数T,表示有T组数据。

对于每组数据,一行,一个正整数N。

\(\color{#0066ff}{输出格式}\)

T行,每行为对应答案。

\(\color{#0066ff}{输入样例}\)

3
1
2
5

\(\color{#0066ff}{输出样例}\)

1
4
55

\(\color{#0066ff}{数据范围与提示}\)

对于30%的数据,1≤T≤5,1≤N≤100000

对于100%的数据,1≤T≤300000,1≤N≤1000000

\(\color{#0066ff}{ 题解 }\)

题目要求

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

转为gcd形式

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

枚举gcd

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

把d弄前面去

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

额,后面的的东西就是与一个数互质的数的和

但是我们只能求个数

考虑若\(gcd(i,n)=1\),则\(gcd(n-i,n)=1\)

显然i一定成对出现

要特判一下1

所以,原式可以变为

\[n\sum_{d|n} \frac {\varphi(\lfloor\frac n d \rfloor)*\lfloor\frac n d \rfloor + 1} {2}
\]

这样最后的复杂度是\(O(T\sqrt n)\)的

不太好卡进去

因为时间浪费在了枚举因子

看到题目n的范围,显然可以开一个数组记录n的答案

这样是\(O(T+n\sqrt n)\)的

考虑枚举倍数,减少无用枚举

\(O(T+nlogn)\)可过

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 1e6 + 10;
LL ans[maxn], phi[maxn], pri[maxn], tot;
bool vis[maxn];
LL getans(LL n) {
return (phi[n] * n + 1) >> 1;
}
void predoit() {
phi[1] = 1;
for(int i = 2; i < maxn; i++) {
if(!vis[i]) pri[++tot] = i, phi[i] = i - 1;
for(int j = 1; j <= tot && (LL)i * pri[j] < maxn; j++) {
vis[i * pri[j]] = true;
if(i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
for(int i = 1; i < maxn; i++)
for(int j = i; j < maxn; j += i)
ans[j] += getans(j / i);
}
int main() {
predoit();
for(int T = in(); T --> 0;) {
LL n = in();
printf("%lld\n", n * ans[n]);
}
return 0;
}

最新文章

  1. 网站过滤器Filter
  2. HTML5中id可以用数字开头,但在css中不能正常使用
  3. 用jQuery重置用于文件上传的input (type=&quot;file&quot;)
  4. 黑马程序员_ C语言基础(一)
  5. 【转】Android 服务器之SFTP服务器上传下载功能
  6. leetcode&mdash;Same Tree
  7. BIEE Setup
  8. WTL的消息机制
  9. 十个iOS面试问题
  10. XHTML表格
  11. mysql常用基础操作语法(九)~~外连接查询【命令行模式】
  12. laravel-Policy步骤
  13. Java接口实现传参
  14. Tornado-基于正则的路由和动态分页
  15. python矩阵的切片(或截取)
  16. paloalto防火墙内存使用率高
  17. LeetCode 788 Rotated Digits 解题报告
  18. Java知多少(75)Object类
  19. 【python学习-4】可复用函数与模块
  20. zzuli1731 矩阵(容斥)

热门文章

  1. c语言-顺序表
  2. 初识python notes
  3. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句
  4. apache server和tomcat集群配置三:水平集群下的tomcat集群配置
  5. python中的整数、浮点数和布尔值
  6. day70 12-存储过程和存储函数
  7. Excel VBA 若要在64位系统上使用,则必须更新此项目中的代码,请检查并更新Declare语句,然后用PtrSafe属性标记它们
  8. DPDK内存管理-----rte_mbuf(转)
  9. Zbar和Z*算法对比
  10. java中byte是什么类型,和int有什么区别