Cod sursa(job #2030471)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 1 octombrie 2017 17:39:35
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#define MOD 9901
using namespace std;
FILE *f=fopen("sumdiv.in","r");
FILE *g=fopen("sumdiv.out","w");
int P[500000];
long long E[500000];
int nr;
int N,B;
int lgpow(int b,long long e)
{
    int p=1;
    while(e)
    {
        if(e&1)p=(1LL*b*p)%MOD;
        b=(1LL*b*b)%MOD;
        e>>=1;
    }
    return p;
}
int scad(int a,int b)
{
    a-=b;
    if(a<0)a+=MOD;
    return a;
}
int mult(int a,int b)
{
    return 1LL*a*b%MOD;
}
int main()
{
    fscanf(f,"%d %d",&N,&B);
    if(N<=1||!B){fprintf(g,"%d",N);return 0;}
    for(int i=2;1LL*i*i<=N;i++)
    {
        if(N%i==0)
        {
            P[++nr]=i;
            while(N%i==0)
            {
                N/=i;
                E[nr]+=B;
            }
        }
    }
    if(N!=1)
    {
        P[++nr]=N;
        E[nr]=B;
    }
    int rez=1;
    for(int i=1;i<=nr;i++)
    {
       /// printf("%d %d\n",P[i],E[i]);
        ///printf("%d ",mult(scad(lgpow(P[i],E[i]+1),1),lgpow(P[i]-1,MOD-2)));
        rez=mult(rez,mult(scad(lgpow(P[i],E[i]+1),1),lgpow(P[i]-1,MOD-2)));
    }
    fprintf(g,"%d",rez);
    fclose(f);
    fclose(g);
    return 0;
}