1.整数的唯一分解定理
任何正整数都有且只有一种方式写出其素因子的乘积表达式。
A=(p1^k1)*(p2^k2)*(p3^k3)*.....*(pn^kn) p均为素数。
2.约数和公式
S=(1+p1+p1^2+.....+p1^k1)*(1+p2+p2^2+.....+p2^k2)*......*(1+pn+pn^2+pn^3+.....+pn^kn);
3.同余模公式
(a+b)%m=(a%m+b%m)%m;
(a*b)%m=(a%m+b%m)%m;
对A分解
A首先对第一个素数不断取模,A%2=0,记录2出现的次数加1,A/=2;A%2!=0,则A对下一个素数3不断取模,
特殊判定:A本身是素数时,就无法分解。
求等比数列的和
若n为奇数,一共有偶数项
1+p+p^2+.....+p^n=(1+p^(n/2+1))+p*(1+p^(n/2+1))+p^2*(1+p^(n/2+1))+.....+p^(n/2)*(1+p^(n/2+1))=(1+p+p^2+....+p^(n/2))*(1+p^(n/2+1))
若n为偶数,一共有奇数项
1+p+p^2+.....+p^n=(1+p^(n/2+1))+p*(1+p^(n/2+1))+p^2(1+p^(n/2+1))+.....+p^(n/2-1)*(1+p^(n/2+1))+p^(n/2)=(1+p+p^2+.....+p^(n/2-1))*(1+p^(n/2+1)+p^(n/2);
long long sum(long long p,long long n)
{
if(n==0) return 1;
if(n%2) return (sum(p,n/2)*(1+power(p,n/2+1)))%mod;
else return (sum(p,n/2-1)*(1+power(p,n/2+1))+power(p,n/2))%mod;
}
反复平方法计算幂次式
此方法只需要o(log2n)即可求幂。
将n化为二进制,若数位上是一,sq=(sq*p)%mod;
long long power(long long p,long long n)
{
long long sq=1;
while(n)
{
if(n&1) sq=(sq*p)%mod;
n>>=1;
p=p*p%mod;
}
return sq;
}
本题代码如下:
#include
#include
#include
using namespace std;
const int mod=9901;
int A,B,p[10005],n[10005];
bool vis[10005];
long long power(long long p,long long n)
{
long long sq=1;
while(n)
{
if(n&1) sq=(sq*p)%mod;
n>>=1;
p=p*p%mod;
}
return sq;
}
long long sum(long long p,long long n)
{
if(n==0) return 1;
if(n%2) return (sum(p,n/2)*(1+power(p,n/2+1)))%mod;
else return (sum(p,n/2-1)*(1+power(p,n/2+1))+power(p,n/2))%mod;
}
int main()
{
while(cin>>A>>B)
{
int k=0;
for(int i=2;i*i<=A;)
{
if(A%i==0)
{
p[++k]=i;
n[k]=0;
while(!(A%i))
{
n[k]++;
A/=i;
}
}
if(i==2) i++;
else i+=2;
}
if(A!=1){
p[++k]=A;
n[k]=1;
}
int ans=1;
for(int i=1;i<=k;i++)
ans=ans*(sum(p[i],n[i]*B)%mod)%mod;
cout<