Aladdin and the Flying Carpet(LightOJ - 1341)(欧拉筛 + 质因数分解)
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)(欧拉筛 + 质因数分解)相关推荐
- T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解
http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...
- Help Hanzo(LightOJ - 1197)(欧拉筛 + 思维)
LightOJ - 1197 Help Hanzo 来源:LightOJ - 1197 Help Hanzo 题意: 判断a ~ b区间内,有多少个素数,a,b范围[1, 2 ^ 31 - 1],b ...
- 欧拉筛 筛法求素数 及其例题 时间复杂度O(n)
埃式筛法尽管不错,但是确实做了许多无用功,某个数可能会被重复的筛好几次,欧拉筛解决了这个方法,下面为代码: 注意理解if(i%prim[j]==0) break; 大佬讲的不错的博客,我就不做复读机了 ...
- cf 1062d 思维 欧拉筛变形
http://codeforces.com/contest/1062/problem/D 题意:给个n ,在n之内 所有(a,b) ,如果存在唯一的x 使a*|x| == b 或者 b* |x| == ...
- 线性筛素数(欧拉筛)
欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...
- 【数的专题】——欧拉筛
上题:https://www.luogu.org/problemnew/show/P3383 当你总是觉得筛质数太慢的时候,不妨来试一下欧拉筛: 基本原理: 设一个整数x,保证它只被它的最小质因子筛去 ...
- Enlarge GCD CodeForces - 1034A(欧拉筛+最大公约数)
题意: 给出n个数,删去其中一些使得总的gcd(最大公约数)最大 题目: Mr. F has n positive integers, a1,a2,-,an. He thinks the greate ...
- 【BZOJ2818】Gcd,数论练习之欧拉筛
传送门 写在前面:比较简单的数论题目了 思路:对i来说,所有与i互质的数和i都乘同一个质数p,那么得到的两个数的gcd一定是p,所以我们就可以利用这个来搞一搞了,对1-n的phi预处理出来(欧拉筛), ...
- 素数筛选法(埃氏筛 欧拉筛)
质数筛选法 文章目录 质数筛选法 前言 一.埃氏筛 O(nloglogn)O(nloglogn)O(nloglogn) 二.欧拉筛O(n)O(n)O(n) 总结 前言 当需要大范围内的素数时,例如1e ...
- 埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
最新文章
- Docker 命令自动补全必须有
- POJ 2724 Purifying Machine (二分图匹配)
- 第二次Soring冲刺计划第二天(个人)
- 让人深思......
- 原生js制作页面长时间未操作退出登录
- 智能合约从入门到精通:完整范例
- yaf 重写index.php,php框架Yaf路由重写实例代码
- php ascii art,ASCII art (简体中文)
- 硬件基础知识---(15) 二极管单项导电特性
- pytorch visdom蓝屏和无法启动
- [HTML] 表单和输入
- ai怎么做波普风圆点_AI绘画教程,绘画波普艺术风格人像
- 金庸的武侠世界和SAP的江湖
- 手机APP——扫描全能王去除水印字样
- 2022当代科学技术前沿知识 课后测试
- 宿舍管理系统1(pyhon与mysql)
- int(size)中的size到底神马意思(mysql)
- 几个简单又实用的配色技巧
- 压缩文件rar解压出现“这个压缩文件格式未知或者数据已经被损坏”
- C++快速讲解(九):I/O操作、模板编程、容器、函数对象
热门文章
- 口算训练(hdu 6287) (唯一分解定理)
- 字符串左斜杠替换成右斜杠
- BZOJ 3689 异或之
- cad画钟表_coreldraw怎么画钟表?coreldraw画钟表教程
- IC基础(三):跨时钟域处理——电平同步器
- php智能文章相关性匹配,PHP中的Pearson相关性
- 【1194】移动路线
- 淘宝新开店铺没有营业执照怎么办
- 雅思阅读真经总纲_雅思阅读用哪本书?五大热门雅思阅读书籍全面点评
- 熊出没之奇幻空间里面的机器人图片_《熊出没之奇幻空间》小铁COCO智能机器人玩具...