数的因子(约数) 素数相关
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
HDU -- 2138 How many prime numbers + hihocoder 1287【大素数判定】
传送门 //思路: 大素数判定的原理是费马小定理 费马小定理: a为整数,p是素数,且a,p互质,则有a^(p-1)≡1(mod p) ,即:a^(p-1)模p得1.快速判定一个数是否为素数的方法: 如果存在一个整数a,使得a^(p-1)≡1(mod p) ,则称p为基于a的伪素数,当有多个满足关系的a时,则p为素数的概率趋向于1。所以取多个a测试一下即可. (感觉随机, 错误概率还是较小.原创 2017-08-04 20:29:59 · 360 阅读 · 0 评论 -
BZOJ 2721 樱花 【推导 + 约数个数定理 + 阶乘含素因子定理】
传送门题意: 1/x + 1/y = 1/n! 求这个等式的正整数解(x, y) 有多少对.思路: 我们首先令n! = z, 那么原式就等于 1/x + 1/y = 1/z, 化简的 xz + yz = xy –> xz + yz - xy + z^2 = z^2, 就等于 (z-x)(z-y) = z^2, 很明显这个方程的解就是z^2的约数个数, 比如n = 2时, 就变成了...原创 2018-08-07 19:17:15 · 292 阅读 · 0 评论 -
SCU - 4573 和 POJ 3904 Sky Code 【思维 + 容斥定理 or 反演】
传送门 题意: 就是给定n个数, 问这里面有多少个四元组满足gcd(a, b, c, d) == 1.思路: 因为题意的那个条件并不是说一定这四个元素就是两两互质的, 所以算正面是有点难算的, 所以我们考虑反面, 用C(n, 4) - 那些gcd(四元组) != 1的, 这是我们就需要枚举gcd了, 1 - 1e4, 那么我们有什么方法可以更快的得到gcd可以等于2的有多少个数乐, 此时我们就需要原创 2018-04-20 18:02:05 · 275 阅读 · 0 评论 -
第13届广工大校赛 F 题 等式 【数学推导 + 约数个数定理】
传送门 题意: 就是求1/x + 1/y = 1/n(x <= y),给定n,求x, y的正整数解.思路:刚那道题是懵逼的, 比赛时也是乱搞的, 后面知道正解了…. (没想到啊), 首先化解原式: yn + xn = xy -> xy - xn - yn = 0 -> xy - xn - yn + n^2 =n^2 -> (x-n)(y-n) = n^2; 化完这里原创 2018-03-24 21:03:55 · 339 阅读 · 0 评论 -
CodeChef - AMR16C Influence on Social media 【思维 + 巧妙求因子个数】
传送门 // 给定n个人发表的帖子数量, 如果一个发表的帖子数量的因子个数是奇素数, 那么他就是一个支持者, 问这n个人中的支持者的排名, 排名是根据在所有人中它发表的帖子数量的多少定的. 并且先输出发表的数量多的.思路: 我们肯定第一步就可以确定的是我们要的数一定是个平方数, 因为一个数的因子都是成对出现的, 其次是如何快速求一个平方数的因子个数了, 用到约数个数定理, 但是还是太慢了, 我们可原创 2018-02-24 13:21:00 · 392 阅读 · 0 评论 -
牛客练习赛9 E题 珂朵莉的数论题
传送门 // 题意: 求第x小的正整数v使得其最小的质因数为质数y,即正好有x-1个[1,v-1]之内的正整数满足其最小的质因数为质数y 若答案超过1000000000则输出0 // 思路: 其实如果范围不大, 我们都可以通过筛法处理. 但是由于数比较大, 也就是当素数因子比较小的时候变不再适用. 方法就是当 y >= p, 可以用1e9/y的筛法处理. y原创 2018-01-06 22:14:17 · 655 阅读 · 0 评论 -
Gym 101615C 【数学思维】
传送门 //题意: 给定一个L, R(均小于1e12 但是R - L <= 1e6 的), 然后求sigma(f(i)) ( L <= i <= R) , f(n)的定义是n的所有的因子之和(包括1和本身). //思路: 我的第一想法就是用约数个数和定理, 但是想了一会就否定了这个想法, 因为复杂度确实是不能过关的, 然后有一个想法就是统计每一个数字的贡献度, 因为因子是双向的, 那么我原创 2017-11-30 00:30:06 · 589 阅读 · 0 评论 -
POJ - 1845 Sumdiv 【约数个数定理 + 约数和定理 + 快速幂 + 逆元】
传送门 必备知识:1 : 约数个数定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式。 A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 其中pi均为素数2 : 约数和公式:对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)有A的所有因子之和为 S = (1+p1+p1^2原创 2017-08-06 12:08:43 · 570 阅读 · 0 评论 -
HDU --- 5901 Count primes 【求1e11内的素数模板题】
传送门 //题意: 求最大1e11内的素数个数. //刚开始做这道题时, 想得可以解决区间1e6以内的素数个数, 然后特判一下输入的数, 分段打表输出答案. 但是死活过不了. 于是搜题解说这个是1e11内的素数个数模板题??? 可以用什么Meisell-Lehmer方法做. 具体证明情况都是给的论文, 我能怎么说, 只能说还是把这个模板留下来, 免得在遇见(手动滑稽). 有两个版本, 一个复杂原创 2017-09-06 15:00:20 · 422 阅读 · 0 评论 -
约数个数定理 和 约数和定理
约数个数定理 在数的因子这一部分具有很大的作用. 在这里就附上代码实现.把任意一个数展开成素数连乘.void solve(ll n) //素数连乘{ printf("%d=",n); int flag = 0; for(ll i=2;i*i<=n;i++){ while(n%i == 0){ n = n/i;原创 2017-08-04 19:30:19 · 8124 阅读 · 2 评论 -
以√n的复杂度求n的因子数.
板子:/** @Cain*/const int maxn=1e6;int pre[maxn];int main(){ int k; cin >> k ; for(int i=1;i*i<=k;i++){ if(k%i==0){ pre[cnt++] = i; pre[cnt++] = k/i;原创 2017-08-04 16:27:32 · 613 阅读 · 0 评论 -
HDU -- 6069 Counting Divisors 【思维 + 二次筛法】多校第四场1003
传送门 //题意就不说了. //思路:首先这个应该可以推到. 所以可以发现这个k次方是没有什么影响的, 还是直接求质因子连乘就是了. //问题的关键在于如何在可行的复杂度中求出区间中每一个数的质因子连乘的幂. n√n的复杂度绝对不行, 所以我们选用类似于区间筛的方法处理. 这样复杂度就大约在nlogn, 因为这个是区间求质因子个数, 与单数求质因子个数肯定不同赛.AC Code/** @C原创 2017-08-05 00:04:13 · 548 阅读 · 0 评论 -
UESTC - 982 质因子连乘 【约数个数定理的初应用】
传送门//所以直接模拟写就可以了.AC Code/** @Cain*/void solve(){ int n; scanf("%d",&n); int flag = 0; int i = 2; printf("%d=",n); while(i*i <= n){ if(n%i == 0){ if(!flag)原创 2017-08-04 17:00:54 · 467 阅读 · 0 评论 -
HDU --- 5778 abs 【枚举平方数 + 思维】
传送门 //题意 : 给定一个x, 求与x相距最近的一个数y, 且y的每种素因子个数恰好只有2个. //思路 : 因为y的每种素因子恰好只有两个, 那么y一定是一个平方数, 那么我们可以对x(因为和y很近)进行开根, 然后判断它的每种素因子是否恰好为一个, 如果不是这个数就不行. 否则就符合. 并且是对x开根后的两边枚举. 然后取一个绝对值小的就行了. 复杂度在O(1e3)左右. AC Cod原创 2017-08-11 18:54:04 · 475 阅读 · 0 评论 -
埃式筛法(素数筛) + 区间素数筛 + 应用
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛埃式筛法:给定一个正整数n(n<=10^6),问n以内有多少个素数?做法:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样...原创 2017-06-22 16:48:01 · 794 阅读 · 0 评论 -
HDU -- 1215 七夕节【技巧求因子和】
传送门//思路: 直接暴力求每一个数的因子和时会T, 所以采用类似埃式筛法的逆应用, 反着求出每一个数的因子和, 通过一个数的倍数.AC Code#include<bits/stdc++.h>int vis[maxn];void init(){ for(int i=1;i<=maxn;i++) //首先每个数都肯定有1这个因子. vis[i]=1; for(i原创 2017-08-04 16:32:29 · 357 阅读 · 0 评论 -
UVA - 10976 Fractions Again?! 【枚举技巧】 水题!
传送门题意: 找到所有的正整数 x >= y, 使得1/k = 1/x + 1/y;思路: 因为 x >= y, 有1/x <= 1/y, 因此1/k - 1/y <= 1/y, 即y <= 2*k, 所以我们枚举y的范围在2k之内即可, 然后计算x, 检验是否合法即可. 复杂度O(k), 其实进一布推到知枚举范围在 k + 1 ~ 2*k 之间……AC ...原创 2018-08-07 19:54:55 · 142 阅读 · 0 评论