题目链接
题意:给出一个n和k,要求输出1到n中有多少个数的最大质因子都小于等于k
T组输入,n和k的范围都是1e9.
做法:如果n≤kn \leq kn≤k 那么答案是nnn.
如果 k<nk< nk<n:

  • 首先考虑一个容斥很容易得到答案的表达如下:
  • ans=n−∑i1pi+∑i<j1pipj−...(−1)k1p1p2...pk(min(p)>k)ans =n -\sum_{i}\frac{1}{p_i}+\sum_{i<j}\frac{1}{p_ip_j} -...(-1)^{k}\frac{1}{p_{1}p_{2}...p_{k}}(min(p)>k)ans=n−∑i​pi​1​+∑i<j​pi​pj​1​−...(−1)kp1​p2​...pk​1​(min(p)>k)
  • 由上面那个式子如果知道容斥和莫比乌斯的肯定很熟悉,他就等于如下的式子:
  • ans=n+∑p>kμ(i)⌊ni⌋,p∣i.ans = n+\sum_{p>k}\mu(i)\lfloor \frac{n}{i}\rfloor,p|i.ans=n+∑p>k​μ(i)⌊in​⌋,p∣i.
  • 上面的ppp是iii的最小质因子,如果不清楚可以看看2013的国家集训队论文。

现在就是怎么求∑p>kμ(i)⌊ni⌋\sum_{p>k}\mu(i)\lfloor \frac{n}{i}\rfloor∑p>k​μ(i)⌊in​⌋。后面的整除我们可以用数论分块O(n)O(\sqrt n)O(n​)来解决。但不过中间的莫比乌斯的值就不好求了。
中间的莫比乌斯函数的值其实就是最小质因子大于等于kkk的数的莫比乌斯的函数值的和。我们考虑使用min25min25min25筛来解决这个问题。
因为min25min25min25的正是处理这些问题了。那么只需要找到最小的大于kkk的质因子就可以筛出函数值了。
这里分类讨论:

  • 首先k>nk>\sqrt nk>n​这种情况下,只要随便出现一个大于kkk的质数那么肯定就是不合法的,那么对于数论分块的一段区间[l,r][l,r][l,r]只需要判断有多少素数,然后乘上⌊nl⌋\lfloor \frac{n}{l} \rfloor⌊ln​⌋就行了。
  • 然后k≤nk\leq\sqrt nk≤n​这种情况下,我就考虑一个比较暴力的做法,因为第一个大于kkk的素因子肯定很容易就能找到,那么对于数论分块的每一段区间[l,r][l,r][l,r]的莫比乌斯函数值,就是s(r,pj)−s(l−1,pj),pj>ks(r,p_{j})-s(l-1,p_{j}),p_j>ks(r,pj​)−s(l−1,pj​),pj​>k直接min25min25min25暴力求就行了。

这个复杂度我就不分析了,因为好像求和部分的复杂度不是很高,并没有TLE。题解和标程的代码我没有看懂,好像他只需要求一次sss数组可以O(1)O(1)O(1)的得出答案了。

#include "bits/stdc++.h"using namespace std;
inline int read() {int x = 0;bool f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';if (f) return x;return 0 - x;
}
#define SZ(x) ((int)(x.size()))
#define all(x) (x).begin(),(x).end()
#define ll long long
const int maxn = 2e5 + 10;
const double PI = acos(-1.0);
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
int inv(int n) {if (n == 1) return 1;return 1ll * inv(mod % n) * (mod - mod / n) % mod;
}
int ksm(int a, ll n) {int ans = 1;while (n) {if (n & 1) ans = 1ll * ans * a % mod;n >>= 1;a = 1ll * a * a % mod;}return ans;
}
inline int add(int u, int v) { return (u += v) >= mod ? u - mod : u; }
inline int sub(int u, int v) { return (u -= v) < 0 ? u + mod : u; }
inline int mul(int u, int v) { return 1ll * u * v % mod; }
int vis[maxn], pri[maxn], cnt, mu[maxn];
void init(int N = maxn - 1) {mu[1] = 1;cnt = 0;for (int i = 2; i <= N; i++) {if (!vis[i]) {pri[++cnt] = i;mu[i] = -1;}for (int j = 1; j <= cnt && i * pri[j] <= N; j++) {vis[i * pri[j]] = 1;if (i % pri[j] == 0) break;mu[i * pri[j]] = -mu[i];}}
}
int id1[maxn], id2[maxn], sqr, n, k, c;
int w[maxn << 1], g[maxn << 1], h[maxn << 1];
inline int getid(int x, int m) {if (x <= sqr) return id1[x];return id2[m / x];
}
void calc_g(int _n) {c = 0, sqr = sqrt(_n);int m = _n;for (int l = 1, r; l <= m; l = r + 1) {r = m / (m / l);w[++c] = m / l;g[c] = w[c] - 1;if (w[c] <= sqr) id1[w[c]] = c;else id2[r] = c;}init(sqr << 1);while (pri[cnt] > sqr) --cnt;for (int j = 1; j <= cnt; j++) {for (int i = 1; i <= c && pri[j] * pri[j] <= w[i]; i++) {int id = getid(w[i] / pri[j], m);g[i] -= g[id] - j + 1;}}
}
inline int fmu(int x) { return x == 1 ? -1 : 0; }
int get(int x, int y) {if (x <= 1 || pri[y] > x) return 0;int id = getid(x, n);int ret = -g[id] + y - 1;for (int i = y; i <= cnt && pri[i] * pri[i] <= x; i++) {int t1 = pri[i], t2 = pri[i] * pri[i];for (int e = 1; t2 <= x; ++e, t1 = t2, t2 *= pri[i])ret += get(x / t1, i + 1) * fmu(e) + fmu(e + 1);}return ret;
}int solve() {int ans = n;if (1ll * k * k > n) {int res = 0, l = k + 1, r = n / (n / l);calc_g(k);res -= g[getid(l - 1, k)];calc_g(n);res += g[getid(r, n)];ans -= res * (n / l);l = r + 1;for (; l <= n; l = r + 1) {r = n / (n / l);res = g[getid(r, n)] - g[getid(l - 1, n)];ans -= res * (n / l);}return ans;}calc_g(n);int t = 1;while (t <= cnt && pri[t] <= k) ++t;for (int l = k + 1, r; l <= n; l = r + 1) {r = n / (n / l);ans += (n / l) * (get(r, t) - get(l - 1, t));
//        cout << (get(r, t) - get(l - 1, t)) << endl;}return ans;
}int main() {//    freopen("1.in", "r", stdin);int T;scanf("%d", &T);
//    init();while (T--) {scanf("%d%d", &n, &k);int ans;if (n <= k) ans = n;else ans = solve();printf("%d\n", ans);}return 0;
}

HDU6834 Yukikaze and Smooth numbers相关推荐

  1. 陈景润定理对筛法理论的重要贡献

    经过查证,在国际最新筛法专著的前言中,作者专门提及陈景润定理的现代意义,而我们国人却陈景润不理解.呜呼! 请看本文附件. 袁萌 陈启清 2月4日 附件:在最新筛法专著的前言中,专门提及陈景润定理的现代 ...

  2. 解开人人网登录密码的 RSA 加密--转载

    本文转载自:https://boj.blog.ustc.edu.cn/index.php/2014/05/renren-password-transfer-security/,纯粹基于兴趣留作记录.以 ...

  3. Smooth Freehand Drawing on iOS

    原网址:https://code.tutsplus.com/tutorials/smooth-freehand-drawing-on-ios--mobile-13164 博客中中文转载地址(直接网页翻 ...

  4. usaco ★Humble Numbers 丑数

    ★Humble Numbers 丑数 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于 S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p ...

  5. Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  6. iwork11旗舰版 linux,苹果 iWork 11 套件来了,Pages/Numbers/Keynote iOS/macOS 版大升级

    IT之家3月24日消息 苹果今天专为 iOS 和 macOS 设备设计的 iWork 应用套件更新到了版本 11,引入了许多新功能和调整,以改善其功能. IT之家获悉,在 iOS 系统上,Pages. ...

  7. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...

  8. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)

    pandas创建内容全是0的dataframe.pandas基于随机整数.随机浮点数创建dataframe(random numbers) 目录 pandas创建内容全是0的dataframe.pan ...

  9. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)

    R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal.density.fitdistr.logcondens.logcondens.smooth) ...

  10. LeetCode 421. Maximum XOR of Two Numbers in an Array--Python解法

    LeetCode 421. Maximum XOR of Two Numbers in an Array–C++,Python解法 LeetCode题解专栏:LeetCode题解 我做的所有的Leet ...

最新文章

  1. 程序员从初级到中级10个秘诀 【转载】
  2. 装好Centos7后提示Initial setup of CentOS Linux 7 (core)
  3. 当try、catch中有return时,finally中的代码会执行么?
  4. platform_driver_probe与platform_driver_register的区别
  5. PHP 计算每个月的最后一天
  6. mysql 数据库存储表情
  7. Kubernetes集群安全概述
  8. 实战演习-用wse上传下载文件
  9. Emmet 语法 速查表
  10. 【java学习之路】(java SE篇)009.IO
  11. java list增改查_Java编程通过list接口实现数据的增删改查代码示例
  12. CSS制作一个半透明边框
  13. unity资源释放(AssetBundle和Asset)
  14. SSD-tensorflow Windows环境下,mAP的计算
  15. 用MATLAB仿真DSB调制
  16. 回顾千年,领略周秦汉唐西安文史5日研学营
  17. algorithm java_Java KeyPairGenerator getAlgorithm()用法及代码示例
  18. 出现Whitelabel Error Page的解决方法(持续更新带图并总结了其他博文)
  19. java古诗_java抓取古诗文的单线程爬虫
  20. 【Java并发编程】闭锁

热门文章

  1. 找老域名有没有什么好方法?
  2. Excel中批量生成复选框,带计算功能。品质管理、调查表常用工具
  3. 个人总结 onSaveInstanceState方法会在什么时候被执行
  4. HttpClient(4.5) post get https 实例
  5. python京东笔试题象棋马走到指定位置方法数
  6. html鼠标移上去变成箭头,js实现鼠标移动到div上变成箭头
  7. 马云收购恒生电子几大关键问题
  8. 挂马攻击的介绍和防御
  9. 【Tools系列】Windows下一款好用的文件搜索工具:XSearch
  10. 程序员的日常工作是怎样的?