题目链接:http://poj.org/problem?id=1845
题目大意:
输入A和B,计算的所有因子之和为s,输出s%9901.
解题思路:
对A进行素因子分解,,则
,所有的因子和为:
,再计算s%9901.
每项求分子时用快速幂取模,处理分母时,9901是素数,除法取模求逆元。
ac代码:
#include<iostream>
#define mod 9901
typedef long long ll;
ll a,b;
ll mul(ll x,ll y)//快速幂
{
ll ans=1;
while(y)
{
if(y&1)
ans=(ans*x)%9901;
x=(x*x)%9901;
y>>=1;
}
return ans;
}
using namespace std;
int main(){
while(cin>>a>>b){
ll su[101][2];
if(a==0){
cout<<"0"<<endl;
}
else if(a==1||b==0){
cout<<"1"<<endl;
}
else{
ll p=0;
for(int i=2;i*i<=a;i++)//素因子分解,求个数
{
if(a%i==0)
{
su[p][0]=i;
su[p][1]=0;
while(a%i==0)
{
a/=i;
su[p][1]++;
}
p++;
}
}
if(a>1)
{
su[p][0]=a;
su[p][1]=1;
p++;
}
for(int i=0;i<p;i++)//记得素因子个数是 k*B+1
{
su[i][1]*=b;
su[i][1]++;
}
ll m=1;
ll x,y;
for(int i=0;i<p;i++)
{
if(su[i][0]%9901==0) continue;
if(su[i][0]%9901==1)
{
m=m*su[i][1]%9901;
continue;
}
m=m*(mul(su[i][0],su[i][1])-1)%9901;//p^(k*B+1)-1
x=mul(su[i][0]-1,9899)%9901;//费马小定理,求(p-1)的逆元
x=(x%9901+9901)%9901;//一项素因子的值
m=m*x%9901;
}
printf("%lld\n",m);
}
}
return 0;
}