Aladdin and the Flying Carpet(LightOJ - 1341)


来源:Aladdin and the Flying Carpet


题意:

给出a和b,求n的因数对(如x * y = a)中min(x, y) >= b并且x != y的有多少对


因数个数与因数总和

若n = x1 ^ p1 * x2 ^ p2 * ... * xn ^ pn
那么n因数个数 e(n) = (p1 + 1) * (p2 + 1) * ... * (pn + 1)所有因数之和 d(n) = (x1 ^ 0 + ... + x1 ^ p1) * ... * (xn ^ 0 + ... + xn ^ pn)

思路:

分两种情况

  • b > sqrt(a)时,结果为0
  • 其余情况,先求出a有多少个因数对(log(a)),之后减去min(x, y) < b 的对数。(这里数据好像挺水的,因为这里复杂度是O(b),4000组b,b的总和还没大于1e8,不然正常来说肯定超时)

代码:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll a, b;
int prime[N], cnt;
bool vis[N];
void init(int n) { //欧拉筛 O(n)vis[1] = 1;for (int i = 2; i <= n; ++i) {if (!vis[i]) prime[cnt++] = i;for (int j = 0; i * prime[j] <= n; ++j) {vis[i * prime[j]] = 1;if (i % prime[j] == 0) break;}}
}
int check(ll a) { //质因数分解求因数个数 log(a)int res = 1;for (int i = 0; i < cnt && sqrt(a) >= prime[i]; ++i)if (a % prime[i] == 0) {int cou = 0;while (a % prime[i] == 0)a /= prime[i], cou++;res *= cou + 1;}if (a > 1) res *= 2;return res;
}
int main() {init(N - 10);int t; scanf("%d", &t);for (int k = 1; k <= t; ++k) {scanf("%lld %lld", &a, &b);if (b > sqrt(a)) {printf("Case %d: 0\n", k);continue;}int all = check(a) / 2; // 因数对为除2//记x * y = a,如果要算x和y相等的,那么all就要向上取整for (int i = 1; i < b; ++i) // 减去因数小于b的 O(b)if (a % i == 0) all--;printf("Case %d: %d\n", k, all);}return 0;
}

END

Aladdin and the Flying Carpet(LightOJ - 1341)(欧拉筛 + 质因数分解)相关推荐

  1. T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解

    http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...

  2. Help Hanzo(LightOJ - 1197)(欧拉筛 + 思维)

    LightOJ - 1197 Help Hanzo 来源:LightOJ - 1197 Help Hanzo 题意: 判断a ~ b区间内,有多少个素数,a,b范围[1, 2 ^ 31 - 1],b ...

  3. 欧拉筛 筛法求素数 及其例题 时间复杂度O(n)

    埃式筛法尽管不错,但是确实做了许多无用功,某个数可能会被重复的筛好几次,欧拉筛解决了这个方法,下面为代码: 注意理解if(i%prim[j]==0) break; 大佬讲的不错的博客,我就不做复读机了 ...

  4. cf 1062d 思维 欧拉筛变形

    http://codeforces.com/contest/1062/problem/D 题意:给个n ,在n之内 所有(a,b) ,如果存在唯一的x 使a*|x| == b 或者 b* |x| == ...

  5. 线性筛素数(欧拉筛)

    欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...

  6. 【数的专题】——欧拉筛

    上题:https://www.luogu.org/problemnew/show/P3383 当你总是觉得筛质数太慢的时候,不妨来试一下欧拉筛: 基本原理: 设一个整数x,保证它只被它的最小质因子筛去 ...

  7. Enlarge GCD CodeForces - 1034A(欧拉筛+最大公约数)

    题意: 给出n个数,删去其中一些使得总的gcd(最大公约数)最大 题目: Mr. F has n positive integers, a1,a2,-,an. He thinks the greate ...

  8. 【BZOJ2818】Gcd,数论练习之欧拉筛

    传送门 写在前面:比较简单的数论题目了 思路:对i来说,所有与i互质的数和i都乘同一个质数p,那么得到的两个数的gcd一定是p,所以我们就可以利用这个来搞一搞了,对1-n的phi预处理出来(欧拉筛), ...

  9. 素数筛选法(埃氏筛 欧拉筛)

    质数筛选法 文章目录 质数筛选法 前言 一.埃氏筛 O(nloglogn)O(nloglogn)O(nloglogn) 二.欧拉筛O(n)O(n)O(n) 总结 前言 当需要大范围内的素数时,例如1e ...

  10. 埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

最新文章

  1. Docker 命令自动补全必须有
  2. POJ 2724 Purifying Machine (二分图匹配)
  3. 第二次Soring冲刺计划第二天(个人)
  4. 让人深思......
  5. 原生js制作页面长时间未操作退出登录
  6. 智能合约从入门到精通:完整范例
  7. yaf 重写index.php,php框架Yaf路由重写实例代码
  8. php ascii art,ASCII art (简体中文)
  9. 硬件基础知识---(15) 二极管单项导电特性
  10. pytorch visdom蓝屏和无法启动
  11. [HTML] 表单和输入
  12. ai怎么做波普风圆点_AI绘画教程,绘画波普艺术风格人像
  13. 金庸的武侠世界和SAP的江湖
  14. 手机APP——扫描全能王去除水印字样
  15. 2022当代科学技术前沿知识 课后测试
  16. 宿舍管理系统1(pyhon与mysql)
  17. int(size)中的size到底神马意思(mysql)
  18. 几个简单又实用的配色技巧
  19. 压缩文件rar解压出现“这个压缩文件格式未知或者数据已经被损坏”
  20. C++快速讲解(九):I/O操作、模板编程、容器、函数对象

热门文章

  1. 口算训练(hdu 6287) (唯一分解定理)
  2. 字符串左斜杠替换成右斜杠
  3. BZOJ 3689 异或之
  4. cad画钟表_coreldraw怎么画钟表?coreldraw画钟表教程
  5. IC基础(三):跨时钟域处理——电平同步器
  6. php智能文章相关性匹配,PHP中的Pearson相关性
  7. 【1194】移动路线
  8. 淘宝新开店铺没有营业执照怎么办
  9. 雅思阅读真经总纲_雅思阅读用哪本书?五大热门雅思阅读书籍全面点评
  10. 熊出没之奇幻空间里面的机器人图片_《熊出没之奇幻空间》小铁COCO智能机器人玩具...