Cod sursa(job #1838412)

Utilizator tanasaradutanasaradu tanasaradu Data 31 decembrie 2016 22:41:03
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<bits/stdc++.h>
#define infinit 9901
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
bitset<1000005>a;
long long n,k,prime[90000],f[20],cnt;
long long expo[20];
long long  nrd,teste;
long long Ciur()
{
    int i,j;
    a[1]=1;
    k=0;
    for(i=4;i<=1000000;i=i+2)a[i]=1;
    for(i=3;i*i<=1000000;i=i+2)
        if(a[i]==0)
    for(j=i*i;j<=1000000;j=j+2*i)a[j]=1;
    prime[1]=2;
    k=1;
    for(i=3;i<=1000000;i=i+2)
        if(a[i]==0)
        prime[++k]=i;
}
long long Putere(long long xs,long long ys)
{
    long long prod=1;
    while(ys>0)
    {
        if(ys%2==1)
        {
            prod=(xs*prod)%infinit;
            ys--;
        }
        ys=ys/2;
        xs=(xs*xs)%infinit;
    }
    return prod;
}
long long Putere1(long long  xs,long long ys)
{
    long long prod=1;
    while(ys>0)
    {
        if(ys%2==1)
        {
            prod=(xs*prod);
            ys--;
        }
        ys=ys/2;
        xs=(xs*xs);
    }
    return prod;
}
long long Nrsum()
{
    long long i,p,y;
    long long x=1;
    for(i=1;i<=cnt;i++)
    {
        p=f[i]-1;
        y=Putere1(f[i],expo[i]);
        y--;
        if(y==(-1))
            y=9900;
        x=1LL*x*(y%infinit)*(Putere(p,9899))%infinit;
    }
    fout<<x%infinit<<"\n";
}
long long Nrdiv(long long n,long long n1)
{
  long long d,i,s;
    nrd=1;
    i=1;
    d=prime[i];
    while(n>1 and d*d<=n and i<=k)
    {
        s=0;
        if(n%d==0)
        {
            f[++cnt]=d;
            while(n%d==0)
            {
                s++;
                n=n/d;
            }
         s=s*n1;
        expo[cnt]=s+1;
        }
        i++;
        d=prime[i];
    }
    if(n>1)
    {
        s=n1;
        f[++cnt]=n;
        expo[cnt]=s+1;
    }
}
int main()
{
    int i;
    long long numar,numar1;
    Ciur();
    fin>>numar>>numar1;
    Nrdiv(numar,numar1);
    Nrsum();
}