Cod sursa(job #1680954)

Utilizator matei140401Iorgulescu Matei matei140401 Data 9 aprilie 2016 10:48:37
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <cstring>
using namespace std;
long long p[15],q[15];
const long long m=9901;
long long put(long long x,long long y)
{
    if(y==0)
        return 1;
    if(y%2)
        return ((x%m)*put(x,y-1))%m;
    else
    {
        long long j=put(x,y/2);
        return j*j%m;
    }
}
long long imod(long long x)
{
    return put(x,m-2);
}
long long fct(long long prim,long long exp)
{
    long long v[40],b[35],nb=0,rez=0;
    memset(v,0,sizeof(v));
    for(long long k=0; k<=30; k++)
        if(exp&(1<<k))
            b[++nb]=k;
    v[0]=1;
    for(long long k=1; k<=b[nb]; k++)
        v[k]=v[k-1]*(put(prim,1<<(k-1))+put(prim,1<<k))%m;
    for(long long k=nb; k>0; k--)
    {
        rez+=v[b[k]]*imod (put (prim, (1<<(b[k]+1) )-exp ) - 1 );
        rez%=m;
        exp-=1<<b[k];
    }
    return rez;


}


int main()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    long long a,b,np=0,produs=1,i,cp;
    fin>>a>>b;
    cp=a;
    if(a%2==0)
    {
        np++;
        p[1]=2;
        while(a%2==0)
        {
            a/=2;
            q[1]++;
        }
    }
    for(i=3; i*i<=a; i+=2)
        if(a%i==0)
        {
            p[++np]=i;
            while(a%i==0)
            {
                a/=i;
                q[np]++;
            }
        }
    if(a>1)
    {
        np++;
        p[np]=a;
        q[np]=1;
    }
    for(i=1; i<=np; i++)
        q[i]=b*q[i]+1;
    for(i=1; i<=np; i++)
    {
        produs*=fct(p[i],q[i]);
        produs%=m;
    }
    if(cp==9901)
    fout<<1;
    else
    fout<<produs;

    return 0;
}