[kuangbin带你飞]数论基础的简单题解

这篇博客汇总了多个数论基础问题的解题思路,包括LightOJ和UVA等平台上的题目,如欧拉函数、质因数分解、最大独立集等。通过质因数分解、枚举、筛素数等方法解决实际问题,适合数论初学者参考。

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

查看题目与代码参考

打星题还没做

Problem A

LightOJ 1370 Bi-shoe and Phi-shoe

欧拉函数+枚举。令k = lucky number+1开始枚举k,直到lucky number φ(k)

Problem B

LightOJ 1356 Prime Independence

*质因数分解+最大独立集。大致的想法是把冲突的2个数连一条边,然后把所有数分成质因子个数(例如8有3个质因子:2,2,2)为奇和偶两部分,以质因子个数为奇为偶构建一个二分图,那么质因子个数同奇或同偶的数一定不是另外一个数的质数倍。

Problem C

LightOJ 1341 Aladdin and the Flying Carpet

质因数分解求约数个数。 n=pa11pa22pass, 那么n的约数个数 num(n)=(a1+1)(a2+1)(as+1) .
详解及代码可查看http://blog.youkuaiyun.com/qq_15714857/article/details/48558963

Problem D

LightOJ 1336 Sigma Function

判断约数之和奇偶性。一个数 n=pe11pe22pess 的约数之和

sum(n)=pe1+111p11pe2+121p21pes+1s1ps1

也等于
sum(n)=(p01+p11+pe11)(p02+p12+pe22)(p0s+p1s+pess)

可以发现,若 pi=2 (p0i+p1i+peii) 一定为奇数;
pi2 (p0i+p1i+peii) 只有在 ei 为偶数时为奇数;
同时,只要任意一个 (p0i+p1i+peii) 为偶数,那么约数之和一定是偶数;反之,若约数之和为奇数,那么除了2之外所有 ei 都为偶数,n 一定是 x2 , 2x 2x2 的形式,而 2x 显然包含在另外两者之中,所以我们减去 x2 , 2x2 形式的数字即可。
很明显,n 以内 x2 形式的数有 n 个 , 2x2 形式的数字有 (n/2) 个,答案即是 nn(n/2)

Problem E

LightOJ 1282 Leading and Trailing

输出一个数的前k位与后k位。前k位利用log10,后k位利用mod10,详解与代码:http://blog.youkuaiyun.com/qq_15714857/article/details/48559687

Problem F

LightOJ 1259 Goldbach`s Conjecture

筛素数+枚举。计算一个数可以被表示成两个素数之和的方案数,预处理出n以内的数是否是素数即可。

Problem G

LightOJ 1245 Harmonic Number (II)
long long H( int n ) {
    long long res = 0;
    for( int i = 1; i <= n; i++ )
        res = res + n / i;
    return res;
}

当除数越大时,所得商就基本不变,那么我们把 n 之前的值正常累加,后面的值累计商*商的个数即可,商的个数等于n/商-n/(商+1)。

Problem H

LightOJ 1236 Pairs Forming LCM

统计lcm(i,j)==n的二元组,1<=i<=j<=n.
http://blog.youkuaiyun.com/qq_15714857/article/details/48641121

Problem I

LightOJ 1234 Harmonic Number

计算调和数。数学好的话直接用欧拉常数来计算。。euler = 0.5772156649015328606,答案大致等于 log(n) + euler + 1.0 / ( 2 * n ) - 1.0 / ( 12 * n^2 ) + 1.0 / ( 120 * n^4 ),当然这里前三项就够了。也可以分段计算,把n分成100项为一组先预处理出答案,再计算剩余的。

Problem J

LightOJ 1220 Mysterious Bacteria

x=bp 已知 x , 求最大的 p 。
枚举b即可。。但要注意x若为负数的话要求p必须为奇数。

Problem K

LightOJ 1214 Large Division

高精度计算一个数能否被另一个数整除。怕麻烦用java,不怕的话模拟一下ans = ( 10 * ans + ( a[i] - '0' ) ) % b ,后者必前者快三十多倍。

Problem L

LightOJ 1213 Fantasy of a Summation

找规律。
ans = k * sum % MOD * fast_pow( n , k - 1 , MOD ) ;

Problem M

LightOJ 1197 Help Hanzo

区间筛素数裸题。

Problem N

LightOJ 1138 Trailing Zeroes (III)

n! 尾部有q个0,求最小n。阶乘结果分解成质因数幂相乘之后,尾部0的个数就等于5的幂,故x! 尾部有 x/5 + x/25 + x/125 + x/625 +… 个零 ,二分答案即可。

Problem O

UVA 11426 GCD - Extreme (II)

输入n,求

gcd(1,2)+gcd(1,3)+gcd(2,3)+...+gcd(n1,n)

大白书例题。

f(n)=gcd(1,n)+gcd(2,n)+...+gcd(n1,n)
那么答案 S(n)=f(1)+f(2)+...+f(n)

gcd(x,n) 的值均为n的约数,枚举n的约数i,
gcd(x,n)=i gcd(x/i,n/i)=1
故满足条件的 x/i 有 φ (n/i)个。那么

f(n)=i|nφ(n/i)i

Problem P

UVA 11754 Code Feat

*大白书例题,dfs+CRT。

Problem Q

UVA 11916 Emoogle Grid

*大白书例题,离散对数。

Problem R

POJ 1061 青蛙的约会

模线性方程。简而言之就是求解

(mn)t=(xy)modL

Problem S

POJ 2115 C Looooops

模线性方程。简而言之就是求解

cx=(ba)mod2k

Problem T

POJ 2116 Death to Binary?

*fibonacci+模拟。巨麻烦的模拟题。。

Problem U

HDU 2161 Primes

素性检测裸题。

Problem V

UVA 11827 Maximum GCD

输入处理+暴力。

Problem W

UVA 10200 Prime Time

预处理一下然后直接查询。。

Problem X

SGU 106 The equation

扩展欧几里得的应用。
很好的题解 :
http://www.cnblogs.com/Rinyo/archive/2012/11/25/2787419.html
求解 ax+by+c=0 在指定区间内的整数解 ,我们可以考虑 ax+by=c 在指定区间内的整数解 , 当 b/| gcd(a,b) 显然无解。
d=gcd(a,b) 我们就可以把原方程转化为

a/dx+b/dy=c/d
然后通过扩展gcd便可得到一组可行解 (x0,y0) ,则其余解即为 x=x0+kb,y=y0ka ,结合约束条件即可得到答案。

Problem Y

POJ 2478 Farey Sequence

F(n)=F(n1)+φ(n)

Problem Z

UVA 11752 The Super Powers

枚举+筛素数。
x=an ,预处理每一个数是否是素数,当 n 不是一个素数也不是1的时候,n 即可分解,x 便符合题意。

### 关于 kuangbin ACM 算法竞赛培训计划 #### 数论基础专题介绍 “kuangbin专题十四涵盖了数论基础知识的学习,旨在帮助参赛者掌握算法竞赛中常用的数论概念和技术。该系列不仅提供了丰富的理论讲解,还推荐了一本详细的书籍《算法竞赛中的初等数论》,这本书包含了ACM、OI以及MO所需的基础到高级的数论知识点[^1]。 #### 并查集应用实例 在另一个具体的例子中,“kuangbin”的第五个专题聚焦于并查集的应用。通过解决实际问题如病毒感染案例分析来加深理解。在这个场景下,给定一组学生及其所属的不同社团关系图,目标是从这些信息出发找出所有可能被传染的学生数目。此过程涉及到了如何高效管理和查询集合成员之间的连通性问题[^2]。 #### 搜索技巧提升指南 对于简单的搜索题目而言,在为期约两周的时间里完成了这一部分内容的学习;尽管看似容易,但对于更复杂的状况比如状态压缩或是路径重建等问题,则建议进一步加强训练以提高解题能力[^3]。 ```python def find_parent(parent, i): if parent[i] == i: return i return find_parent(parent, parent[i]) def union(parent, rank, x, y): rootX = find_parent(parent, x) rootY = find_parent(parent, y) if rootX != rootY: if rank[rootX] < rank[rootY]: parent[rootX] = rootY elif rank[rootX] > rank[rootY]: parent[rootY] = rootX else : parent[rootY] = rootX rank[rootX] += 1 # Example usage of Union-Find algorithm to solve the virus spread problem. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值