AcWing 97. 约数之和
原题链接
中等
作者:
L_9
,
2020-01-18 18:00:37
,
所有人可见
,
阅读 5
A的分解质因数是 A=p1^k1*p2^k2*p3^k3...pn^kn
A的约数为任取p的值,与对应k,即 p1^k1*p2^k2*p3^k3..pn^kn
将378000分解质因数378000=2^4×3^3×5^3×7^1
约数之一为 2^0*3^0*5^0*7^1 2^1*3^0*5^0*7^1 也是他的约数
所有约数和即为 (p1^0+p1^1+...p1^k1)(p2^0+p2^1+...p3^k2)...(pn^0+pn^1+...pn^kn) <--多项式和提取公因式变多项式乘积
对于每个项 (p1^0+p1^1+...p1^k1) ,p是质因数,k是项数,整个式子是等比数列
求A的约数和 转变为找A的质因数与质因数项数
A^B的约数和,每个项变为(p1^0+p1^1+...p1^k1B) 即k的范围增大B倍
(p1^0+p1^1+...p1^k) 这个式子可以分为两部分 (p1^0+p1^1+...p1^k/2)+(p1^k/2+p1^(k/2+1)+...p1^k)
(项数为偶数,k为奇数)
sum(p,k) = (p1^0+p1^1+...p1^k) =(p1^0+p1^1+...p1^k/2)+(p1^(k/2+1)+p1^(k/2+2)+...p1^k)
=(p1^0+p1^1+...p1^k/2)+p1^(k/2+1)(p1^0+p1^1+...p1^k/2)
=(1+p1^(k/2+1))(p1^0+p1^1+...p1^k/2)
=(1+p1^(k/2+1))sum(p,k/2);
(项数为奇数,k为偶数)->(k为奇数)
sum(p,k) = p*sum(p,k-1) +1;
#include<iostream>
using namespace std;
const int mod = 9901;
int qpow(int n,int k)
{
int res=1;
n=n%mod;
while(k)
{
if(k&1) res = res%mod*n%mod;
n=n%mod*n%mod;
k>>=1;
}
return res;
}
int sum(int p,int k)
{
if(k==0) return 1;
if(k%2==0) return (p%mod*sum(p,k-1)%mod+1)%mod;
return ( 1+qpow(p,(k/2+1))%mod )*sum(p,k/2)%mod ;
}
int main()
{
int A,B;
cin>>A>>B;
int res=1;//结果
int s;
//求分解质因数
for(int i=2;i<=A;i++)
{
s=0;//此质因数的k
while(A%i==0)
{
s++;
A=A/i;
}
if(s) res = res*sum(i,s*B)%mod;
}
if (!A) res = 0;
cout << res << endl;
return 0;
}