Cod sursa(job #2000713)

Utilizator Bodo171Bogdan Pop Bodo171 Data 14 iulie 2017 15:12:10
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
const int mod=9901;
int pu[30],pr[30],A,B,i,j,fix,prim,k,tot;
int put(int unu,long long doi)
{
    int ans=1,p2=(unu%mod);
    for(long long p=0;p<=60;p++)
    {
        if(((1LL<<p)&doi))
        {
            ans=(ans*p2)%mod;
        }
        p2=(p2*p2)%mod;
    }
    return ans;
}
int divide(long long P)
{
    if(P==1)
        return 1;
    int ret=divide(P/2);
    ret=(ret+(ret*put(prim,P/2))%mod)%mod;
    if(P%2)
        ret=(ret+put(prim,P))%mod;
    return ret;
}
int main()
{
    ifstream f("sumdiv.in");
    ofstream g("sumdiv.out");
    f>>A>>B;
    i=2;fix=(int)floor(sqrt(A))+5;
    while(i<=fix)
    {
       if(A%i==0)
       {
           k++;pr[k]=i;
           while(A%i==0)
           {
               A/=i;
               pu[k]++;
           }
       }
       i++;
    }
    if(A!=1)
    {
        k++;
        pr[k]=A;pu[k]=1;
    }
    tot=1;
    for(i=1;i<=k;i++)
    {
        prim=(pr[i]%mod);
        tot=(tot*divide(pu[i]*B+1))%mod;
    }
    g<<tot;
    return 0;
}