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



小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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值