Cod sursa(job #851295)

Utilizator dariusdariusMarian Darius dariusdarius Data 9 ianuarie 2013 20:35:23
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define d first
#define e second
#define mp make_pair
using namespace std;
vector< pair<int,int> > v;
int power(int a,int n,int k)
{
    int r=1;
    for(r=1,a=a%k;n;n>>=1)
    {
        if(n&1)
            r=(r*a)%k;
        a=(a*a)%k;
    }
    return r;
}
int invmod(int x)
{
    return power(x,9901-1-1,9901);
}
int main()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    int i,d,a,b,ca,rez=1,r=1;
    scanf("%d%d",&a,&b);ca=a;
    for(d=2;d*d<=ca && a>1;d++)
        if(a%d==0)
        {
            v.push_back(mp(d,0));
            while(a%d==0) {a=a/d;v[v.size()-1].e++;}
        }
    if(a>1) v.push_back(mp(a,1));
    for(i=0;i<(int)v.size();i++)
    {
        v[i].e*=b;
        int x,y;
        x=power(v[i].d,v[i].e+1,9901)-1;if(x==-1) x=9900;
        y=v[i].d-1;
        r=(x*invmod(y))%9901;
        rez=(rez*r)%9901;
    }
    printf("%d\n",rez);
    return 0;
}