POJ1845s——Sumdiv()

传送门

我们可以发现aba^b的所有质因子其实就是bbaa的所有质因子

所以我们先求出a的所有质因子

然后把数量乘b就可以了

而对于一个数的所有质因子之和ΣpkΣp^k

等于(1+p1+p1^2 +p13+…p1k1) * (1+p2+p22+p23+….p2^k2) * (1+p3+ p3^3 +…+ p3^k3) * … * (1+pn+pn^2 +pn^ +…pn^kn)

而对于每一部分,都是一个等比数列

只需要递归去求

然后把所有乘起来就是了

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<math.h>
#include<cstring>
#include<string.h>
#include<cstdlib>
using namespace std;
#define ll long long
#define mod 9901
ll a,b;
ll de[1000000],num[100000],j,ans;
inline int read(){
 char ch=getchar();
 int res=0;
 while(!isdigit(ch)) ch=getchar();
 while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
 return res;
}
inline ll fen(ll k)
{
 for(ll i=2;i*i<=k;i++)
 {
  if(k%i==0)
  {
   de[++j]=i;
   while(k-(k/i)*i==0)
   {
    num[j]++;
    k/=i;
   }
   num[j]*=b; 
  }
 }
 if(k!=1)
 {
  de[++j]=k;
  num[j]=b;
 }
}
inline ll mul(ll p,ll n)
{
 int as=1;
 while(n>0)
 {
  if(n%2)
  {
   as=(as*p)%mod;
  }
  n/=2;
  p=p*p%mod;
 }
 return as;
}
inline ll sum(ll p,ll n)
{
 if(n==0) return 1;
 if(n%2) 
 {
  return (sum(p,n/2)*(1+mul(p,n/2+1)))%mod;
 }
 return (sum(p,n/2-1)*(1+mul(p,n/2+1))+mul(p,n/2))%mod;
}
int main(){
 a=1ll*read();
 b=1ll*read();
 fen(a);
 ans=1;
 for(int i=1;i<=j;i++)
 {
  ans*=sum(de[i],num[i]);
  ans%=mod;
 }
 cout<<ans<<endl;
 return 0;
}
原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366442.html