【UOJ188】【UR #13】Sanrd

本文介绍了一种求解特定范围内所有整数的第二大质因子之和的问题。通过类似Min25筛法的思想,定义了一个递推函数s(N,i),并实现了时间复杂度为O(N^(3/4)/LogN)的算法。

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

【题目链接】

【思路要点】

  • f(x) f ( x ) 表示 x x 次大的质因子,那么答案即为i=lrf(i),也就是说我们要求的实际上是 Ni=1f(i) ∑ i = 1 N f ( i )

  • 考虑从小到大枚举每一个质因子,最后第二个被枚举到的质因子即为 f(x) f ( x )

  • 类似 Min25 M i n 25 筛的过程,我们令 s(N,i) s ( N , i ) 表示上次选择的质因子为 primei1 p r i m e i − 1 ,剩余部分的乘积不超过 N N 的数的f(x)之和。

  • s(N,i)=0primei1(Nj=1[j is a prime](j1))+prime2jNj=iprimek+1jNk=1(s(Nprimekj,j+1)+primej)primei>NprimeiN s ( N , i ) = { 0 p r i m e i > N p r i m e i − 1 ∗ ( ∑ j = 1 N [ j   i s   a   p r i m e ] − ( j − 1 ) ) + ∑ j = i p r i m e j 2 ≤ N ∑ k = 1 p r i m e j k + 1 ≤ N ( s ( ⌊ N p r i m e j k ⌋ , j + 1 ) + p r i m e j ) p r i m e i ≤ N

  • 那么 Ni=1f(i)=s(N,1) ∑ i = 1 N f ( i ) = s ( N , 1 )

  • 时间复杂度 O(N34LogN) O ( N 3 4 L o g N )

【代码】


#include<bits/stdc++.h>

using namespace std;
const int MAXN = 700005;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); } 
template <typename T> void read(T &x) {
  x = 0; int f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  x *= f;
}
template <typename T> void write(T x) {
  if (x < 0) x = -x, putchar('-');
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
  write(x);
  puts("");
}
ull n, limit, val[MAXN], cnt[MAXN];
int m, tot, prime[MAXN], f[MAXN], home1[MAXN], home2[MAXN];
void init(int n) {
  tot = 0;
  for (int i = 2; i <= n; i++)
      f[i] = 0;
  for (int i = 2; i <= n; i++) {
      if (f[i] == 0) prime[++tot] = f[i] = i;
      for (int j = 1; j <= tot && prime[j] <= f[i]; j++) {
          int tmp = prime[j] * i;
          if (tmp > n) break;
          f[tmp] = prime[j];
      }
  }
}
ull s(ull x, int y) {
  if (x <= 1 || prime[y] > x) return 0;
  ull ans = 0;
  if (x <= limit) ans = cnt[home1[x]] - (y - 1);
  else ans = cnt[home2[n / x]] - (y - 1);
  ans *= prime[y - 1];
  for (int i = y; i <= tot && 1ull * prime[i] * prime[i] <= x; i++) {
      ull now = prime[i], nxt = now * now;
      for (int j = 1; nxt <= x; j++, now *= prime[i], nxt *= prime[i])
          ans += s(x / now, i + 1) + prime[i];
  }
  return ans;
}
ull solve(ull x) {
  n = x;
  limit = sqrt(n);
  init(limit);
  m = 0;
  for (ull i = 1, nxt; i <= n; i = nxt) {
      ull tmp = n / i;
      nxt = n / tmp + 1;
      val[++m] = tmp;
      cnt[m] = tmp - 1;
      if (tmp <= limit) home1[tmp] = m;
      else home2[i] = m; 
  }
  for (int i = 1; i <= tot; i++)
  for (int j = 1; 1ull * prime[i] * prime[i] <= val[j]; j++) {
      ull tmp = val[j] / prime[i];
      if (tmp <= limit) cnt[j] -= cnt[home1[tmp]] - (i - 1);
      else cnt[j] -= cnt[home2[n / tmp]] - (i - 1);
  }
  return s(n, 1);
}
int main() {
  ull l, r; read(l), read(r);
  writeln(solve(r) - solve(l - 1));
  return 0;
}
• 1.1 .1 优傲机器人包含哪些部件? 简单描述安装步骤优傲机器人包含哪些部件? 简单描述安装步骤优傲机器人包含哪些部件? 简单描述安装步骤优傲机器人包含哪些部件? 简单描述安装步骤优傲机器人包含哪些部件? 简单描述安装步骤优傲机器人包含哪些部件? 简单描述安装步骤• 1.2 .2 简述机器人关节名称? 技术参数简述机器人关节名称? 技术参数简述机器人关节名称? 技术参数简述机器人关节名称? 技术参数• 1.3 .3 .3 机器人的操作? 在哪看版本号机器人的操作? 在哪看版本号机器人的操作? 在哪看版本号• 2.1 .1 如何设置机器人 IP 地址? 如何设置安全密码地址? 如何设置安全密码地址? 如何设置安全密码• 2.2 .2 怎样用不同的特征移动机器人?哪里可看到 怎样用不同的特征移动机器人?哪里可看到 怎样用不同的特征移动机器人?哪里可看到 怎样用不同的特征移动机器人?哪里可看到 IO 信号的状态? 信号的状态? 信号的状态? • 2.3 .3 如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行如何给机器人程序的指令添加参数? 模拟运行• 3.1 TCP.1 TCP.1 TCP.1 TCP.1 TCP.1 TCP是什么含义? 参数如何得到的是什么含义? 参数如何得到的• 3.2 TCP.2 TCP .2 TCP.2 TCP.2 TCP.2 TCP有关的脚本哪些? • 3.3 .3 机器人运动指令和路点有几种? 机器人运动指令和路点有几种? • 3.4 .4 机器人运动指令有哪些? 包含参数机器人运动指令有哪些? 包含参数机器人运动指令有哪些? 包含参数机器人运动指令有哪些? 包含参数• 3.5 .5 .5 基本指令有哪几个? 设置些功能基本指令有哪几个? 设置些功能基本指令有哪几个? 设置些功能基本指令有哪几个? 设置些功能• 3.6 .6 -3.7 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 哪些指令有不断检查表达式功能,是如何起作用的?开关和 If 指令有什么差别? 指令有什么差别? 指令有什么差别? 指令有什么差别? • 3.8 .8 变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别变量有几种类型? 是如何定义的全局和部差别• 3.9 .9 赋值语句表达的变量如何人工输入? 赋值语句表达的变量如何人工输入?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值