Cod sursa(job #1705445)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 20 mai 2016 16:53:54
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#define  MLC
#include <bits/stdc++.h>
using namespace std;
typedef long long i64;

const int MOD = 9901;

bitset<2000> c;
vector<int>  p;
vector<pair<int , int> > fkt;


void erat(int lim) {
    c[0] = 1;
    c[1] = 1;
    for(int i=4; i<=lim; ++i, ++i)
        c[i] = 1;
    for(int i=3; i<=lim; ++i, ++i) {
        if(c[i])
            continue;
        for(i64 j=1LL*i*i; j<=lim; j+=i+i)
            c[j] = 1;
    }
    for(int i=1; i<=lim; ++i)
        if(!c[i])
            p.push_back(i);
}

int expow(int b, int e) {
    int ans = 1;
    while(e) {
        if(e&1)
            ans=ans*b%MOD;
        b=b*b%MOD;
        e>>=1;
    }
    return ans;
}

int mod(int a, int b) {
    return (a%b<0)?(b+a%b):(a%b);
}

void fact(int arg) {
    int c, d;
    for(int i=0; p[i]*p[i]<=arg; ++i) {
        if(arg%p[i])
            continue;
        c=0;
        while(arg%p[i]==0) {
            arg/=p[i];
            ++c;
        }
        fkt.push_back(make_pair(p[i], c));
    }
    if(arg>1)
        fkt.push_back(make_pair(arg, 1));
}

int main(void) {
    FILE *fi = fopen("sumdiv.in", "r");
    FILE *fo = fopen("sumdiv.out", "w");
    int a, b, nu, nd;

    erat(1500);
    nu = 1;
    nd = 1;

    fscanf(fi,"%d%d",&a,&b);
    fact(a);
    for(auto &i:fkt)
        i.second*=b;

    for(auto &i:fkt) {
        nu = mod(nu * (expow(i.first, i.second+1)-1), MOD);
        nd = mod(nd * (i.first-1), MOD);
    }

    fprintf(fo,"%d\n",mod(nu*expow(nd, MOD-2), MOD));

    fclose(fi);
    fclose(fo);
    return 0;
}