分治+质因数分解——约数之和_北岭山脚鼠鼠的博客-CSDN博客
思路:
约数之和可以用公式求得,在用公式前需要先求得a^b的所有质因数以及出现次数。
公式里面的每一项都是一个等比数列,可以使用等比数列求和公式求得
为(p1 ^ ( B * a1 + 1 ) - 1 )/(p1 - 1 ),在学习了乘法逆元后,对于这种需要取模含分母运算的可以使用逆元的乘法来代替除法,分子直接使用快速幂,分母部分则是用乘(p1-1)的逆元代替除
(p1-1).
特殊的,当p-1是9901的倍数时,此时乘法逆元不存在,但是有p%9901=1.
代码:
- #include
- using namespace std;
- typedef long long ll;
- typedef pair<int,int>PII;
- const int N=1e6+10,mod=9901;
- int primes[N],cnt[N];
- int idx;
- ll ans;
- bool st[N];
- void get_primes(int n)
- {
- for(int i=2;i*i<=n;i++)
- {
- if(n%i==0)
- {
- primes[++idx]=i;
- cnt[idx]=0;
- while(n%i==0) n/=i,cnt[idx]++;
- }
- }
- if(n>1) primes[++idx]=n,cnt[idx]=1;
- }
- ll qmi(ll a, ll k,ll p)
- {
- ll res=1;
- while(k)
- {
- if(k&1) res=res*a%p;
- k>>=1;
- a=a*a%p;
- }
- return res;
- }
- int main()
- {
- ll a,b;
- ans=1;
- cin>>a>>b;
- get_primes(a);
- for(int i=1;i<=idx;i++)
- {
- if((primes[i]-1)%mod==0)
- {
- ans=((ll)b*cnt[i]+1)%mod*ans%mod;
- continue;
- }
-
- ll x=qmi(primes[i],(ll)b*cnt[i]+1,mod);
- x=(x-1+mod)%mod;
- int y=primes[i]-1;
- y=qmi(y,mod-2,mod);
- ans=ans*x%mod*y%mod;
- }
- if(a!=0)
- cout<
- else
- cout<<0<
- return 0;
- }
-
相关阅读:
归并排序算法(思路分析) [数据结构][Java]
java中的注解
面试中的自我激励:如何展示你的内在驱动力
有关自动化测试,你应该要了解这些..
设计模式(15)组合模式
perl学习笔记(九)用正则表达式处理文本(2)
每日10行代码173:测试下yafu的质因数分解能力
Python下sensor_msgs.msg.PointCloud2数据的高效读取
掌握Linux常用命令,扫平面试需求障碍
CSS 6 CSS 盒子模型
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126798927