质因数

SCUT - 485 - 质因数计数 - 原根

十年热恋 提交于 2019-11-27 00:51:25
https://scut.online/p/485 给定a和n,求有多少个质数p,满足n是使得a^n=1 mod p成立的最小正整数。 翻译:求有多少个质数p,使得a模p的阶delta_m(a)是n 先验证 a^n=1 mod p 成立 那么假如还有更小的m使得 a^m=1 mod p 成立,则这个p不合要求 由阶的性质有delta_m(a)|n,故只需要检查n的所有因子就可以了。 但其实不需要检查所有因子,只需要检查n的所有质因子。(从板子上面可以看出来,但是为什么) 即 a^(p_i) = 1 mod p 是否成立,假如恒不成立,则n是a模p的阶,其中p_i是n的每种质因子。 证明如下:很显然的,原本我们要检查n的所有因子才能确定阶,但是有一个更好的办法。 假如还有更小的m使得 a^m=1 mod p 成立,那么m的倍数km也一定满足 a^(km)=1 mod p 成立,那么从n中只去除一个质因子p_i,假如这个t=(n/p_i)有 a^t=1 mod p ,则可能存在更小的m使得 a^m=1 mod p 成立。否则假如 a^t != 1 mod p ,则t的所有因子也都不需要检查了。 这样就只需要检查log次。 来源: https://www.cnblogs.com/Yinku/p/11337094.html

洛谷 P5150 生日礼物 题解

霸气de小男生 提交于 2019-11-26 12:33:42
题面 因为 n=lcm(a,b)n = lcm(a, b) n = l c m ( a , b ) ,可以得出: a 和 b 的质因数都是 n 的质因数 对于 n 的每个质因数 x ,在 n 中的次数为 y ,那么 x 在 a 和 b 中至少有一个次数为 y ,在另一个中的次数 <=y 。 所以我们只要把 n 的每个质因数的次数求出来就好了 即ans=(2a1+1)×(2a2+1)×……×(2an+1)。 #include <iostream> #include <cmath> #pragma GCC optimize(2) using namespace std; void fenjie(long long n) { long long ans=1; for(register long long i=2;i<=sqrt(n);i++) { if(n%i==0) { int cnt=0; while(n%i==0) { n/=i; cnt++; } ans*=(2*cnt+1); } } if(n>1) ans*=3; cout<<ans; } int main () { long long n; cin>>n; fenjie(n); } 来源: https://www.cnblogs.com/kamimxr/p/11320317.html