记录编号 553405 评测结果 AAAAAAAAAAAAA
题目名称 [POJ 1845] Sumdiv 最终得分 100
用户昵称 GravatarOasiz 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2020-08-19 15:54:46 内存使用 0.00 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
ll a,b,ans;
struct num{
	int ba;
	int ex;
}d[100002];
ll pw(ll pn,ll pm){
    ll sq = 1;
    while(pm>0){
        if(pm%2){
            sq = (sq*pn)%9901;
        }
        pm = pm / 2;
        pn = pn * pn % 9901;
    }
    return sq;
}
ll g(ll pn,ll pm){
    if(pm == 0){
        return 1;
    }
    if(pm%2){
        return (g(pn,pm/2)*(1+pw(pn,pm/2+1)))%9901;
    }
    else{
        return (g(pn,pm/2-1)*(1+pw(pn,pm/2+1))+pw(pn,pm/2))%9901;
    }
}
int main(int argc, char** argv){
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	cin>>a>>b;
	if(a==0){
		ans=0;
	}
	else{
		ans=1;
		int k=0;
        for(int i=2;i*i<=a;){
            if(a%i==0){
                d[k].ba=i;
                d[k].ex=0;
                while(a%i == 0)
                {
                    d[k].ex++;
                    a/=i;
                }
                k++;
            }
            if(i==2){
                i++;
            }
            else{
                i+=2;
            }
        }
        if(a!=1){
            d[k].ba=a;
            d[k].ex=1;
            k++;
        }
		for(int i=0;i<k;i++){       
            ans=(ans*(g(d[i].ba,d[i].ex*b)%9901)%9901);
        }
	}
	cout<<ans;
	return 0;
}