Mai intai trebuie sa te autentifici.
Cod sursa(job #2465744)
Utilizator | Data | 30 septembrie 2019 19:13:08 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
#include <fstream>
#include <iostream>
#include <cmath>
#define inf 1000000
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
long long x, t, suma, nrdiv;
int prim[inf];
bool ciur[inf];
void ssnd(long long n) {
suma = 1;
nrdiv = 1;
long long i = 1;
int putere;
while (prim[i] <= sqrt(x) && n > 1) {
putere = 0;
while (n % prim[i] == 0) {
putere++;
n /= prim[i];
}
if (putere > 0) {
nrdiv = nrdiv * (putere + 1);
suma = suma * ((pow(prim[i], putere+1) - 1) / (prim[i] - 1));
cout << nrdiv << " " << suma << " ";
}
i++;
}
if (n > 1) {
suma *= n+1;
nrdiv *= 2;
}
}
void eratosthenes() {
int k = 1;
for (int i = 2; i < inf; i++)
ciur[i] = 1;
for (int i = 2; i < inf; i++)
if (ciur[i] && i * i < inf) {
for (int j = i + i; j < inf; j = j + i)
ciur[j] = 0;
prim[k++] = i;
}
else if (ciur[i])
prim[k++] = i;
}
int main()
{
f >> t;
eratosthenes();
for (int i = 1; i <= t; i++) {
f >> x;
ssnd(x);
g << nrdiv << " " << suma % 9973<< "\n";
}
return 0;
}