Pagini recente » Cod sursa (job #2865968) | Cod sursa (job #1817080) | Cod sursa (job #1703392) | Cod sursa (job #860554) | Cod sursa (job #1545271)
#include <stdio.h>
#include <math.h>
#define lung 1000001
struct Res
{
unsigned long long nr;
unsigned long long sum;
};
FILE* fin;
FILE* fout;
unsigned long long* divizori;
int* puteri;
int* sol;
Res result;
void load()
{
fin = fopen("ssnd.in","r");
fout = fopen("ssnd.out","w");
}
int readT()
{
int t;
fscanf(fin,"%d",&t);
return t;
}
int init()
{
load();
return readT();
}
void write(Res res)
{
fprintf(fout,"%llu %llu\n",res.nr,res.sum);
}
int getPuteri(unsigned long long n)
{
int rad ;
rad = sqrtl(n);
divizori = new unsigned long long[rad + 1];
puteri = new int[rad+1];
sol = new int[rad+1];
int d = 2;
int p;
int index = 0;
while(n!=1)
{
p = 0;
while(n%d == 0)
{
n /= d;
p++;
}
if(p!=0)
{
divizori[index] = d;
puteri[index] = p;
index++;
}
d++;
}
return index;
}
void freeData()
{
delete[] divizori;
delete[] puteri;
delete[] sol;
divizori = 0;
puteri = 0;
sol = 0;
}
unsigned long long sum(int n)
{
int sum;
sum = 1;
for(int i=0;i<n;i++)
{
sum*=powl(divizori[i],sol[i]);
}
return sum;
}
void Backtr(int i,int n)
{
if(i == n)
{
result.nr++;
result.sum +=sum(n);
}
else
{
for(int j = 0 ; j<= puteri[i];j++)
{
sol[i] = j;
Backtr(i+1,n);
}
}
}
void ssnd(int t)
{
unsigned long long nr;
for(int k=0;k<t;k++)
{
fscanf(fin,"%llu",&nr);
result.nr = 0;
result.sum = 0;
Backtr(0,getPuteri(nr));
write(result);
freeData();
}
}
void CloseFiles()
{
fclose(fin);
fclose(fout);
}
void Terminate()
{
CloseFiles();
freeData();
}
int main()
{
ssnd(init());
Terminate();
return 0;
}