Cod sursa(job #1016692)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 octombrie 2013 16:53:11
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#define X 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

int A,B,S;

long long Putere(long long N,long long P)
{

    long long m=1;
    while (P!=1)
    if(P % 2==0)
    {
        N=(N*N) % X;
        P/=2;
    }
    else
    {
        m=(m*N) % X;
        P--;
    }
    return (m*N)% X;
}

bool Prim(int x)
{
    if(x==2)return true;
    if(x % 2==0)return false;
    for(int i=3;i*i<=x;i+=2)
        if(x % i==0)return false;
    return true;
}

int main()
{
    f>>A>>B;
    if(!B){g<<1<<'\n';return 0;}
    if(!A){g<<0<<'\n';return 0;}
    if(A==1 || A % X==0){g<<1<<'\n';return 0;}
    S=1;
    if(A % 2==0)
    {
        int k=0;
        while(A % 2==0)A/=2,++k;
        int p1=(Putere(2,k*B+1)+X-1)% X;
        S=(1LL*S*p1) % X;
    }
    for(int i=3;i*i<=A;i+=2)
        if(A % i==0)
        {
            int k=0;
            while(A % i==0)A/=i,++k;
            int p1=(Putere(i,k*B+1)+X-1)% X;
            int p2=Putere(i-1,X-2);
            S=(((1LL*S*p1) % X)*p2)% X;
        }
    if(A>1)
    {
        int k=1;
        int p1=(Putere(A,k*B+1)+X-1)% X;
        int p2=Putere(A-1,X-2);
        S=(((1LL*S*p1) % X)*p2)% X;
    }
    g<<S<<'\n';
    f.close();g.close();
    return 0;
}