最高科技——快速枚举约数

求数\(n\)的最小的约数\(r\),使\(r\)满足性质\(P\),这些性质满足这样的一个条件:若有\(d|r\)满足性质\(P\),则有\(r\)也满足\(P\)。

首先\(O(\sqrt{n})\)直接暴力枚举因数显然可行,然而我们有更快的方法。

设\(n=p_1^{k_1}p_2^{k_2}\ldots p_m^{k_m}\)

我们先从大到小枚举数\(w_1\),使其成为最小的\(w_1\)使得\(t=p_1^{w_1}p_2^{k_2}\ldots p_m^{k_m}\)满足\(P\)。

再枚举\(w_2\),使其成为最小的\(w_2\)使得\(t=p_1^{w_1}p_2^{w_2}\ldots p_m^{k_m}\)满足\(P\)。

一直枚举,得到数\(t=p_1^{w_1}p_2^{w_2}\ldots p_m^{w_m}\),即为最终的答案。

正确性由性质的性质显然,不计因式分解,则总时间复杂度为\(O(\lg n \cdot P)\)。

这个方法的应用暂且知道两个:

一是求原根,枚举约数时直接改为上面的方法,验证一个数的时间降为\(O(\lg^2 n)\)。

二是求字符串的最小循环节,将本来的枚举约数改为上述算法,那就只用枚举\(O(\lg n)\)种长度。

最高科技——快速枚举约数

时间: 2024-08-10 23:29:24

最高科技——快速枚举约数的相关文章

NSDictionary使用快速枚举方法

上一章我们通过一个枚举器访问并返回字典里的键值, 现在我们通过快速枚举来查找键对应的值. 涉及到的方法: objectForKey: 这个方法的意思是返回一个值给对应的键, 下面使用了两次这个方法, 第一次没在循环里面使用, 输入了值@"1", 对应的值就是@"One". PS: 在这里, 我们找到了键, 就代表找到了值. 下面是例子: #import <Foundation/Foundation.h> int main(int argc, const

ObjectC----字典类和集合类以及快速枚举和OC中的数组排序

// Create By 郭仔  2015年04月01日20:06:36 // 不可变字典 // 字典是适用于存放键值对的一种集合,里面的元素必须是对象类型 // 字典是无序的 // 字典赋值 NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"guozai",@"name",@"nan",@"sex",@"14",@"

6、iOS快速枚举

今天在写程序的时候想在当前视图跳转的时候释放掉当前视图上面add的一些子视图.因为add的子视图有些是在别的类里面add进来的,当前页面不知道自己当前有哪几个类型的子视图.这样,我就想到了用循环遍历来查看当前视图有没有符合条件的子视图,如果有的话就释放掉. 我是这样写的: for(UIView * subView in self.view.subviews) { if([subView isKindOfClass:[XYZSeniorQueryView class]]) { [subView r

【数论】【枚举约数】【友好数】CODEVS 2632 非常好友

O(sqrt(n))枚举约数,根据定义暴力判断友好数. 1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 int n; int limit; 5 int main() 6 { 7 scanf("%d",&n); 8 for(;;n++) 9 { 10 limit=sqrt(n); int tot=1; 11 if(limit*limit==n) tot+=limit; 12 for

【数论】【最大公约数】【枚举约数】CODEVS 1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组

对于一对数(p,q),若它们的gcd为x0,lcm为y0, 则:p*q/x0=y0,即q=x0*y0/p, 由于p.q是正整数,所以p.q都必须是x0*y0的约数. 所以O(sqrt(x0*y0))地枚举约数,依次用gcd判断. 1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 typedef long long LL; 5 LL limit,Q,P,To; 6 int ans; 7 LL gcd(LL a,

Objective-C中快速枚举和数组排序

快速枚举 for (<#type *object#> in <#collection#>){ } object是遍历得到的元素对象,collection是集合类型的对象:数组,字典,集合. 数组枚举得到数组中的元素对象. 字典枚举得到字典中的key值. 集合枚举得到集合中的元素对象. 1 // 数组 2 NSArray *arr = [NSArray arrayWithObjects:@"iPhone", @"demaxiya", @&quo

【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题

∵∑gcd(i, N)(1<=i <=N) =k1*s(f1)+k2*s(k2)+...+km*s(km) {ki是N的约数,s(ki)是满足gcd(x,N)=ki(1<=x<=N)的x的个数} ∴gcd(x,N)=ki (1<=x<=N)  <=>  gcd(x/ki,N/ki)=1 (1<=x/ki<=N/ki) gcd(x/ki,N/ki)=1 (1<=x/ki<=N/ki) 的x的个数 即为φ(N/ki) ∴ans=∑φ(N/

NSArray的快速枚举使用方法

快速枚举法创建数组: 快速枚举法的原理和枚举差不多, 只是写法更加的简单明了. 快速枚举法一样需要先创建一个不可变数组, 然后通过快速枚举, 将数组里面的元素逐个打印出来. 下面让我们来看看详细的例子: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *array = [[NSArray alloc]initWithObjects:@&q

ios之快速枚举

for(UIView * subView in self.view.subviews) { if([subView isKindOfClass:[XYZSeniorQueryView class]]) { [subView removeFromSuperview]; subView = nil;//错误 } } 错误提示信息: Fast enumeration variables can't be modified in ARC by default;declare the variable _