POJ1845 Sumdiv

http://poj.org/problem?id=1845

数学

很容易想到,将数\(A\)进行质因数分解,然后计算因数和即可

我调了\(1.5h\),数学真的烂\(QAQ\)

注意:调代码一定不要浮躁,不要觉得自己的代码没有问题

#include<iostream>
#include<cstdio>
#include<cmath>
#define N 1000005
#define int long long
using namespace std;
long long mod=9901;
int cnt,fa,a,b,c[N][2];
long long n,m;
inline long long ksm(long long x,long long y)
{
    long long ans=1;
    while (y)
    {
        if (y&1)
            ans=ans*x%mod;
        x=x*x%mod;
        y >>=1;
    }
    return ans;
}
inline void ins(int x)
{
    ++cnt;
    c[cnt][0]=x;
    c[cnt][1]=0;
    while (fa%x==0)
    {
        c[cnt][1]++;
        fa/=x;
    }
}
long long ef(long long x,long long y)
{
    if (y==1)
        return 1ll;
    long long z=ef(x,y/2);
    if (y%2==0)
        return (z+z*ksm(x,y/2)%mod)%mod; else
        return ((z+z*ksm(x,y/2)%mod)%mod+ksm(x,y-1))%mod;
}
signed main()
{
    while (scanf("%lld%lld",&a,&b)==2)
    {
        cnt=0;
        int g=(int)sqrt(a);
        fa=a;
        for (int i=2;i<=g;i++)
            if (fa%i==0)//爆炸点1:把fa/i也丢进去,当成了寻找因数(实际是要寻找所有质因数及其次数)
                ins(i);
        if (fa!=1)//爆炸点2:判fa!=a,同上,当成了寻找因数
        {
            cnt++;
            c[cnt][0]=fa;
            c[cnt][1]=1;
        }
        long long ans=1;
        for (int i=1;i<=cnt;i++)
        {
            n=c[i][0];
            m=c[i][1];
            long long cs=m*b;
            n%=mod;
            ans=ans*ef(n,cs+1)%mod;
        }
        ans=(ans%mod+mod)%mod;
        cout << ans << endl;
    }
    return 0;
}
posted @ 2020-07-20 16:42  GK0328  阅读(76)  评论(0编辑  收藏  举报