nyist 小M的因子和 (A^B的因子和)

来源:互联网 发布:汽车零部件数据库 编辑:程序博客网 时间:2024/05/17 07:34


小M的因子和

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

M在上课时有些得意忘形,老师想出道题目难住他。小M听说是求因子和,还是非常得意,但是看完题目是求A的B次方的因子和,有些手足无措了,你能解决这个问题吗?

输入
有多组测试样例
每行两个数 A ,B ,(1≤A,B≤10^9)
输出
输出A的B次方的因子和,并对9901取余。
样例输入
2 3
样例输出
15
A^B素因子和  将A分解A^B=p1^(k1*B)+p2^(k2*B)+....+pn^(kn*B)
#include <iostream>#include <stdio.h>using namespace std;int p[10010],k[10010],num;void syz ( int a )// 分解质因数素因子及其个数{    int i,ans=a;    num=0;    for(i=2; i*i<=a; i++)    {        if(ans%i==0)        {            p[num]=i;            k[num]=0;            while(ans%i==0)            {                ans/=i;                k[num]++;            }            num++;        }    }    //cout<<"ans="<<ans<<endl;    if(ans!=1)    {        //cout<<"num="<<num<<endl;        p[num]=ans;        k[num]=1;        num++;    }//   cout<<"num ="<<num<<endl;//    for(i=0;i<num;i++)//        cout<<i <<" " << p[i]<<" "<<k[i]<<endl;}int fastpow ( int a,int b)//快速幂{    int p= 9901;    int ans=1;    a=a%p;    while( b )    {        if(b&1) ans=ans*a%p;        a=a*a%p;        b>>=1;    }    //cout<<"ans="<<ans<<endl;    return ans;}int sum_(int a,int n)//等比数列二分(分治)求和{    if(n==0) return 1;    if(n&1) return sum_(a,n/2)*(fastpow(a,(n/2+1))+1)%9901;    else return (sum_(a,n/2-1)*(fastpow(a,n/2)+1)+fastpow(a,n))%9901;}int main(){//freopen("Input.txt","r",stdin);    //   freopen("aaa.txt","w",stdout);    int A , B ,w[10010] ,i,ans;    while( cin >> A >> B)    {        syz(A);        for(i=0; i<num; i++)        {            k[i]=k[i]*B;            //  cout<<"k[i]= "<<k[i]<<endl;        }        for(i=0; i<num; i++)        {            w[i]=sum_(p[i],k[i]);        }        ans=1;        for(i=0; i<num; i++)            ans=(ans*w[i])%9901;        cout<<ans<<endl;    }    return 0;}        

0 0