poj 1845

来源:互联网 发布:java网上商城源码下载 编辑:程序博客网 时间:2024/05/22 01:47
题目:求出A^B的因子和modp的值
思路:利用sigma函数计算即可。sum=(p1^(k1*B+1)-1)/(p1-1)*...
     然后就是将/(p1-1)转化成逆元去计算 就可以避免/运算。
    但是这边有一个问题是 如果p|p1-1  那么逆元无解。wa情况。

    也就只能另外计算了。p1=k*p+1 因为对于乘法同余,所以值为(k1*B+1)


#include <stdio.h>#include <stdlib.h>#include <iostream>#include <math.h>#include <algorithm>using namespace std;typedef long long ll;const int maxn=50000;const int mod=9901;bool vis[maxn];int prime[maxn],len=0;void pri(){    for(int i=2;i<maxn;i++)    {        if(!vis[i]) prime[len++]=i;        for(int j=0;j<len&&i*prime[j]<maxn;j++)        {            vis[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}ll extend_gcd(ll a,ll b,ll &x,ll &y){    if(a==0&&b==0) return -1;//无最大公约数    if(b==0){x=1;y=0;return a;}    ll d=extend_gcd(b,a%b,y,x);    y-=a/b*x;    return d;}ll mod_reverse(ll a,ll n){    ll x,y;    ll d=extend_gcd(a,n,x,y);    if(d==1) return (x%n+n)%n;    else return -1;}ll pow_mod(ll a,ll b){    ll ans=1;    while(b)    {        if(b&1) ans=(ans*a)%mod;        a=a*a%mod;        b>>=1;    }    return ans%mod;}int main(){    //freopen("in.txt","r",stdin);    pri();    int n,b;    while(scanf("%d%d",&n,&b)!=EOF)    {        //cout<<n<<" "<<b<<endl;        if(n==0){printf("%d\n",n);continue;}        if(n==1||b==0){printf("1\n");continue;}        int en=sqrt(n+0.5),ans=1;        for(int i=0;i<len&&prime[i]<=n;i++)        {            int temcou=0,temans=1;            if(n%prime[i]==0)            {                //printf("%d->",prime[i]);                int k=prime[i]%mod;                while(n%prime[i]==0)                    {n/=prime[i];temcou++;temans=temans*k%mod;}                if(k!=1)                {ll subans=((pow_mod(temans,b)*k)%mod-1+mod)%mod;///p^(k1*b+1)                ll b_reverse=mod_reverse(prime[i]-1,mod);               // printf("subans: %I64d   b_reverse:%I64d\n",subans,b_reverse);                ans*=subans*b_reverse%mod;                }                else ans*=temcou*b+1;                    ans%=mod;            }        }        if(n>1)        {            int k=n%mod;            //printf("----%d\n",k);            if(k!=1)            {ll subans=((pow_mod(k,b)*k)%mod-1+mod)%mod;///p^(b+1)            ll b_reverse=mod_reverse(n-1,mod);///n-1和mod是倍数            ans*=subans*b_reverse%mod;}            else ans*=(b+1)%mod;            ans%=mod;        }        printf("%d\n",ans%mod);    }    return 0;}


0 0
原创粉丝点击