Cod sursa(job #1183738)

Utilizator xtreme77Patrick Sava xtreme77 Data 10 mai 2014 01:10:00
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <cmath>
#define MAX 5000014
#define PRIME_MAX 502000
#define op %9901
using namespace std;
bool boolish[MAX];
int prime[PRIME_MAX],np;
void ciur();
int pow(int x,int y);
int main()
{
    int fact,a,b;
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    ciur();
    scanf("%d%d",&a,&b);
    int suma=1;
    for(int j=1;j<=np and a>1 and prime[j]*prime[j]<=a;++j){
        if(a%prime[j])continue;
        fact=0;
        while(a%prime[j]==0){
            ++fact;
            a/=prime[j];
        }
        long long p1=(pow(prime[j],fact+1)-1)op;
        long long p2=pow(prime[j]-1,9971)op;
        suma=(((suma*p1)op)*p2)op;;
    }
    if(a>1){
        if(a op!=1){
            long long p1 =(pow(a,b+1)-1+9901)op;
            long long p2 =(pow(a-1,9899))op;
            suma=(((suma*p1)op)*p2)op;
        }
        else
            suma=(1LL*suma*(b+1))op;
    }
    printf("%d\n",suma op);
    return 0;
}
void ciur()
{
    int n=5000000,i,j,lim;
    lim=7071;
    prime[1] = 2; np = 1;
    for (i=3; i<=lim; i=i+2)
        if (boolish[i]==0){
            for (j=i*i; j<=n; j=j+2*i)
                boolish[j]=1;
            prime[++np]=i;
        }
    for(i=prime[np]+2; i<=n; i=i+2)
        if(boolish[i]==0)
            prime[++np]=i;

}
int pow(int x,int y){
    int rez;
    for(rez=1;y;y>>=1){
        if(y&1){
            rez=(1LL*rez*x)op;
        }
        x=(1LL*x*x)op;
    }
    return rez op;
}