题意:求a^b的因子的和。
对a进行素因子分解a=p1^k1*p2^k2*...*pn^kn则根据成型函数的性质有s=(1+p1+p1^2+p1^3...p1^(k1*b))*....()
等比数列直接二分求前n项和即可。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 30000 bool isprime[maxn]; int prime[maxn],nprime; typedef long long int64; int64 modmult(int64 a,int64 b,int64 n)//a*b%n { a%=n; int64 ret; for(ret=0; b; a=(a<<1)%n,b>>=1) if(b&1) ret=(ret+a)%n; return ret; } int64 modular(int64 a,int64 b,int64 n)//renturn a^b%n { int64 ans=1; a%=n; while(b) { if(b&1) ans=modmult(ans,a,n),b--; b>>=1; a=modmult(a,a,n); } return ans; } void getprime() { memset(isprime,1,sizeof(isprime)); long long i,j; nprime=0; for(i=2; i<maxn; i++) if(isprime[i]) { prime[nprime++]=i; for(j=i*i; j<maxn; j+=i) isprime[j]=0; } } long long fac[100][2],tol; void getfac(int n) { tol=0; int x=n; memset(fac,0,sizeof(fac)); for(int i=0; prime[i]*prime[i]<=n; i++) if(x%prime[i]==0) { fac[tol][0]=prime[i]; while(x%prime[i]==0) fac[tol][1]++,x/=prime[i]; tol++; } if(x>1) fac[tol][0]=x,fac[tol++][1]++; } long long getsum(long long a,long long k,long long m) { if(k==1) return a%m; if(k&1) return (a+modmult(getsum(a,k/2,m),(a+modular(a,k/2+1,m))%m,m))%m; return modmult(getsum(a,k/2,m),1+modular(a,k/2,m),m); } int main() { getprime(); int a,b; long long ans; while(~scanf("%d%d",&a,&b)) { if(a==1||b==0) { puts("1"); continue; } ans=1; getfac(a); for(int i=0; i<tol; i++) { fac[i][1]*=b; ans=(ans*(getsum(fac[i][0],fac[i][1],9901)+1))%9901; } ans=(ans%9901+9901)%9901; printf("%d\n",ans); } return 0; }
时间: 2024-09-23 03:32:30