POJ 1845 数论

来源:互联网 发布:软件项目介绍费 编辑:程序博客网 时间:2024/05/17 14:14

这题数论考察的范围很广。。我就被坑爹了。。。看来这种中档的数论题还是不够熟练。。T T

题意就是求A^B的约数之和,A,B上线很大,暴力坑定不行。。由于A^B的质因子与A的质因子相同,所以用唯一分解定理。根据唯一分解定理求出约数之和。若A=a1^b1*a2^b2*..*an^bn,则A的约数之和为S(a1,b1)*S(a2,b2)*...S(an,bn)。其中S(a,b)是1+a+..+a^b。。等比数列秒掉。接下来就是考虑模的问题。模除的公式是A%b=A*b^-1%mod...但使用逆元也是有条件的,就是b必须和mod互质,所以分两种情况讨论即可。附代码:

#include <iostream>#include <cstdlib>#include <cstdio>#include <cmath>#include <cstring>#include <vector>#ifdef _WIN32  #define ll __int64  #define out64 "%I64d\n"  #define in64 "%I64d"  #else  #define ll long long  #define out64 "%lld\n"  #define in64 "%lld"  #endif   #define read(a) scanf(in64,&a)#define N 7100#define pb push_back#define mod 9901using namespace std;int a[N];vector<int>b;void prime(){    int i,j;    for (i=2;i<N;i++)        if (!a[i])        {            b.pb(i);            for (j=i*2;j<N;j+=i) a[j]=1;        }    return;}ll ssum(ll t,ll z){    ll q=t%mod,res=1;    while (z>0)    {        if (z&1) res=(res*q)%mod;         z>>=1;        q=(q*q)%mod;      }     return res;}void extend(ll a0,ll b0,ll &x,ll &y){    if (!b0)    {        x=1;y=0;    }    else    {        extend(b0,a0%b0,x,y);        int temp=x;x=y;        y=temp-a0/b0*y;    }}  ll ny(ll t){    ll x,y;    extend(t,mod,x,y);    return (x%mod+mod)%mod;}ll sum(ll t,ll z){    if ((t-1)%mod==0)    {        return (z+1)%mod;    }    ll aa=(ssum(t,z+1)-1+mod)%mod;    ll res=aa*ny(t-1)%mod;    return res;}ll diving(ll n,ll m){    int i;    ll res=1,n1=n;    for (i=0;i<b.size();i++)        if (n%b[i]==0)        {            ll z=0;            while (n1%b[i]==0)             {                n1/=b[i];                z++;            }            z*=m;            res=res*sum(b[i],z)%mod;        }    if (n1!=1) res=res*sum(n1,m)%mod;    return res;}int main(){    ll n,m;    prime();    while (read(n)!=EOF)    {        read(m);        if (n==0) printf("0\n");        else if (m==0) printf("1\n");        else        {             ll res=diving(n,m);            printf(out64,res);        }    }    return 0;}


 

原创粉丝点击