Cod sursa(job #1302990)

Utilizator refugiatBoni Daniel Stefan refugiat Data 27 decembrie 2014 15:16:43
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<vector>
#include<bitset>
#include<math.h>
#define nmax 8000
using namespace std;
bitset<nmax> ciur;
int inmex(int b,int e)
{
    int m=9901,rez=1;
    while(e>0)
    {
        if(e%2==1)
        {
            rez=(rez*b)%m;
        }
        e=e/2;
        b=(b*b)%m;
    }
    return rez;
}
int main()
{
    ifstream si;
    si.open("sumdiv.in");
    FILE* so=fopen("sumdiv.out","w");
    int n,p;
    si>>n>>p;
    int c=0;
    int x=1,s=1;
    if(n%2==0)
    {
        while(n%2==0)
        {
            ++c;
            x=(x*2)%9901;
            n=n/2;
        }
        s=(s*(inmex(x,p)*2-1))%9901;
       // cout<<2<<' '<<c<<'='<<x<<endl;
    }
    int j,i,z=(int)sqrt(n);
    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*(inmex(x,p)*i-1)/(i-1))%9901;

            //    cout<<i<<' '<<c<<'='<<x<<endl;
            }
        }
    }
    if(n!=1)
    {
        s=(s*(inmex(n,p)*n-1)/(n-1))%9901;
        //cout<<n<<' '<<1<<'='<<x;
    }
    fprintf(so,"%i\n",s);
}