Cod sursa(job #1303040)

Utilizator refugiatBoni Daniel Stefan refugiat Data 27 decembrie 2014 16:04:15
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<bitset>
#include<math.h>
#define nmax 25000010
using namespace std;
bitset<nmax> ciur;
int inm(int b,int e)
{
    int r=1,m=9901;
    while(e>0)
    {
        if(e%2==1)
        {
            r=(r*b)%m;
        }
        e=e/2;
        b=(b*b)%m;
    }
    return r;
}
int main()
{
    ifstream si;
    si.open("sumdiv.in");
    FILE* so=fopen("sumdiv.out","w");
    int n,p;
    si>>n>>p;
    int x;
    int c;
    int s=1,z=(int)sqrt(n);
    if(n%2==0)
    {
        x=1;
        c=0;
        while(n%2==0)
        {
            ++c;
            x=(x*2)%9901;
            n=n/2;
        }
        s=(s*(inm(x,p)*2-1))%9901;
    }
    int i,j;
    for(i=3;i<=z;i=i+2)
    {
        if(ciur[i]==0)
        {
            for(j=3;i*j<=z;j=j+2)
            {
                ciur[i*j]=1;
            }
            if(n%i==0)
            {
                c=0;
                x=1;
                while(n%i==0)
                {
                    ++c;
                    x=(x*i)%9901;
                    n=n/i;
                }
                s=(s*(inm(x,p)*i-1)/(i-1))%9901;
            }
        }
    }
    if(n!=1)
    {
        s=(s*(inm(n,p)*n-1)/(n-1))%9901;
    }
    fprintf(so,"%i\n",s);
}