Cod sursa(job #1506602)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 20 octombrie 2015 20:25:01
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <cstdlib>
#define MAXN 5000
#define MOD 9901
int div1[MAXN],exp[MAXN];
using namespace std;
inline int cmmdc(int a,int b){
    int r;
    while(b){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
inline int put(int a,int b){
    int prod=1;
    while(b){
        if(b&1)
            prod=(prod*a)%MOD;
        b>>=1;
        a=(a*a)%MOD;
    }
    return prod;
}
inline int cauta(int a,int b){
    int i,flag=0,nr,z;
    nr=put(a%MOD,b+1)-1;
    z=cmmdc(a-1,MOD);
    i=1;
    while(i<=MOD&&flag==0){
        if(nr==((a-1)*i/z))
            flag=i;
         i++;
    }
    return flag;
}

int main(){
    FILE*fi,*fout;
    int i,con,a,b,prod;
    fi=fopen("sumdiv.in" ,"r");
    fout=fopen("sumdiv.out" ,"w");
    fscanf(fi,"%d%d" ,&a,&b);
    i=2;
    con=0;
    while(i*i<=a){
        while(a%i==0){
            a/=i;
            exp[con]++;
        }
        if(exp[con]>0)
            div1[con++]=i;
        i++;
    }
    if(a){
        exp[con]=1;
        div1[con++]=a;
    }
    prod=1;
    for(i=0;i<con;i++)
        prod=(prod*cauta(div1[i],exp[i]*b));
    fprintf(fout,"%d" ,prod);
    fclose(fi);
    fclose(fout);
    return 0;
}