Cod sursa(job #1693954)

Utilizator tanasaradutanasaradu tanasaradu Data 24 aprilie 2016 13:18:42
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include<bitset>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset<1000005>a;
int k,prime[90000];
unsigned long long suma,nrdivizori,y,n;
void Ciur()
{
    int i,j;
    a[1]=1;
    k=0;
    for(i=4;i<=1000005;i=i+2)a[i]=1;
    for(i=3;i*i<=1000005;i=i+2)
        if(a[i]==0)
    for(j=i*i;j<=1000005;j=j+2*i)a[j]=1;
    prime[1]=2;
    k=1;
    for(i=3;i<=1000005;i=i+2)
        if(a[i]==0)
        prime[++k]=i;
}

int Ridicare(unsigned long long x,unsigned long long p)
{
   unsigned long long  s=1;
    while(p>0)
    {
        if(p%2==1)
        {
            s=1LL*s*x;
            p--;
        }
        x=1LL*x*x;
        p=p/2;
    }
    return s;
}

void  Rezolvare(unsigned long long  z)
{
    unsigned long long  s,d,i=1;
    suma=nrdivizori=1;
    d=2;
    while(z>1 and d*d<=z and i<=k)
    {
        s=0;
        while(z%d==0)
        {
            z/=d;
            s++;
        }
        if(s!=0)
        {
            nrdivizori*=(s+1);
            suma=(1LL*(suma/(d-1))*(Ridicare(d,s+1)-1))%9973;
        }
        i++;
        d=prime[i];
    }
    if(z>1)
    {
        nrdivizori*=2;
        suma=(1LL*(suma/z-1)*(Ridicare(z,2)-1))%9973;
    }
}

int main()
{
    int i;
    fin>>n;
    Ciur();
    for(i=1;i<=n;i++)
    {
        fin>>y;
        Rezolvare(y);
        fout<<nrdivizori<<" "<<suma<<"\n";
    }
}