Sumdiv poj 1845

来源:互联网 发布:sql utf8编码转换gbk 编辑:程序博客网 时间:2024/06/05 04:31

Sumdiv poj 1845
等比数列求和并取模,非逆元方法

const int  M = 9901;long long qpow(long long a,long long b){    a %= M;    long long ans = 1;    while(b>0)    {        if(b&1)        ans = ans*a%M;        a = a*a%M;        b >>= 1;    }    return ans;}//素数表const int LEN = 1e4+100;bool vis[LEN];int Prime[LEN];int cnt = 1;void init(void){    int n = LEN - 1;    for(int i = 2;i <= n; ++i)    {        if(!vis[i])        {            Prime[cnt++] = i;            for(int j = i + i; j <= n; j += i)             vis[j] = true;        }    }}int Fract[LEN][2];int num;void getPrime(long long n){    num = 0;    for(int i = 1;Prime[i] * Prime[i] <= n; ++i)    {        if(n % Prime[i]==0)        {            Fract[++num][0] = Prime[i];            Fract[num][1] = 0;            while(n%Prime[i]==0)            {                Fract[num][1]++;                n /= Prime[i];             }        }    }    if(n != 1)    {        Fract[++num][0] = n;        Fract[num][1] = 1;    }}long long Sum(long long p,long long a)//某一个因子求和{    if(p == 0)      return 0;    if(a == 0)      return 1;    if(a&1)        return (1 + qpow(p,a/2+1)) % M * Sum(p,a/2) % M;    return ((1 + qpow(p,a/2+1)) % M * Sum(p,a/2-1) % M + qpow(p,a/2))%M;}int main(void){//    cout<<qpow(2,10)<<endl;   std::ios::sync_with_stdio(false);   init();   int A,B;   while(cin>>A>>B)   {      getPrime(A);      long long ans = 1;      for(int i = 1;i <= num; ++i)         ans = (ans*Sum(Fract[i][0],B*Fract[i][1]))%M;      cout<<ans<<endl;   }   return 0;}

2 变换 + 逆元求解
逆元方法

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int M = 9901;long long muti(long long a,long long b,long long Mod)//二分乘法{    long long ans = 0;    while(b > 0)    {        if(b&1)        ans = (ans + a) % Mod;        a = (a + a) % Mod;        b >>= 1;    }    return ans;}long long qpow(long long q,long long a,long long Mod){    q %= Mod;    a += 1;    long long ans = 1;    while(a>0)    {        if(a&1)            ans = muti(ans,q,Mod);        q = muti(q,q,Mod);        a >>= 1;    }    return (ans-1+Mod)%Mod;}int main(){//    cout << "Hello world!" << endl;    long long  A,B;    while(cin>>A>>B)    {//        if(A == 0)//        {//            cout<<0<<endl;//            break;//        }        long long ans = 1;        for(long long  i = 2;i * i <= A; ++i)        {            if(A%i==0)            {                int num = 0;                while(A%i == 0)                {                    num++;                    A /= i;                }                ans = ans * (qpow(i,B*num,(i-1)*M) / (i-1) % M) % M;            }        }        if(A!=1)         ans = ans * (qpow(A,B,(A-1)*M)/(A-1)%M) % M;        cout<<ans<<endl;    }    return 0;}
原创粉丝点击