5845 A^B的约数和

描述

给定两个正整数A和B(0<=A, B<=5*107),求AB的所有约数之和,因为结果可能很大,你只要将结果对9901取余即可。

输入

两个正整数A和B(0<=A, B<=5*107

输出

AB 约数之和mod 9901。

样例输入

2 3 

样例输出

15

出处

代码记录

#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
const int mod=9901;
typedef long long ll;
int a,b;
ll num[N],siz[N];
ll power(ll x,ll y)
{
      ll ans=1;
      while(y>0)
      {
          if(y%2)ans=(ans*x)%mod;
          y/=2;
          x=x*x%mod;
      }
      return ans;
}//快速幂
ll sum(ll x,ll y)
{
    if(y==0)return 1;
    if(y%2)return  (sum(x,y/2)*(1+power(x,y/2+1)))%mod;
    return  (sum(x,y/2-1)*(1+power(x,y/2+1))+power(x,y/2))%mod;
}
int main()
{
      cin>>a>>b;
      int i=2,k=0,ans=1;
      while(i*i<=a)
      {
          if(a%i==0)
          {
              num[k]=i;
              while(a%i==0)
              {
                  siz[k]++;//记录第k个因子的个数
                  a/=i;
              }
              k++;
          }
          i==2?i++:i+=2;//忽略除2以外的偶数。
      }
      if(a!=1)num[k]=a,siz[k++]=1;
      //上面找出a所有的因子
      for(int i=0;i<k;i++)
      {
          ans=(ans*(sum(num[i],siz[i]*b)%mod))%mod;
      }
      cout<<ans<<endl;
}
View Code

猜你喜欢

转载自www.cnblogs.com/llhsbg/p/11374720.html