Cod sursa(job #1693941)

Utilizator tanasaradutanasaradu tanasaradu Data 24 aprilie 2016 12:48:31
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include<bitset>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset<1000005>a;
int n,k,prime[90000],suma,nrdivizori,y;
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(int x,int p)
{
    int s=1;
    while(p>0)
    {
        if(p%2==1)
        {
            s=s*x;
            p--;
        }
        x=x*x;
        p=p/2;
    }
    return s;
}

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

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