Cod sursa(job #2354596)

Utilizator robertbirsanRobert Birsan robertbirsan Data 25 februarie 2019 13:27:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb

#include <cstdio>
#include<fstream>
#define nmax 1000010
#define modulo 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bool v[nmax];
int prim[nmax/2],k=0;

void ssnd(int &suma,int &nr, long long n)
 {
    int p;
    long long q=1;
    nr=1;
    suma=1;
    for(int i=0;i<k && prim[i]*prim[i]<=n;i++)
        {
        if(n%prim[i]) continue;
        p=1;
        q=prim[i];
        while (n%prim[i]==0)
        {
            n/=prim[i];
            p++;
            q*=prim[i];
        }
        nr*=p;
        suma=(suma*(q-1)/(prim[i]-1))%modulo;
    }
    if (n>1) {
        nr*=2;
        suma = (suma*(n+1)) % modulo;
    }

}

int main() {
    int t;
    long long n;
    int suma,nr;
    //generez, cu ciurul lui eratostene, toate nr prime <=10^6
    int i=2,j;
    while(i<nmax)
        {
        if(v[i]==0) {
            //deci i e numar prim
            prim[k++]=i;
            //notez in tot vectorul
            for(j=i+i; j<nmax; j+=i)
                v[j]=1;
        }
        i++;
    }

    f>>t;


    for(i=0; i<t; i++)
        {
            f>>n;

        ssnd(suma,nr,n);
    g<<nr<<" "<<suma<<"\n";

    }

    return 0;
}