Pagini recente » Cod sursa (job #3160542) | Cod sursa (job #1019955) | Cod sursa (job #500326) | Cod sursa (job #2643874) | Cod sursa (job #701150)
Cod sursa(job #701150)
#include<fstream>
#include<cmath>
#define NMAX 1000010
#define MMAX 100000
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int prim[MMAX], np;
bool ciur[NMAX];
void Ciur()
{
int i,j;
np=1; prim[np]=2;
for (j=4; j<NMAX; j+=2) ciur[j]=1;
for (i=3; i<NMAX; i+=2)
if (!ciur[i])
{
prim[++np]=i;
for (j=i+i; j<NMAX; j+=i) ciur[j]=1;
}
}
int Solve(int x, int &nr, int &sum)
{
int rez,p, i,rad,gata=0,q=1,aux=x;
//nr de divizori
nr=1; sum=(1+x)%MOD; rad=sqrt((double)x);
for (i=1; aux>=prim[i]*prim[i]; ++i)
{
rez=1;p=prim[i]; gata=0;q=p;
while (x%p==0)
{
++rez;
if (p*p<=aux)sum=(sum+p+(aux/p))%MOD;
if ((x%(p*prim[i]))==0) q*=prim[i];
p*=prim[i];
}
if (x%q==0) x/=q;
nr*=rez;
}
if (x!=1) nr*=2;//, sum=(sum+x+aux/x)%MOD;
if (rad*rad==x) sum=(sum+MOD-rad)%MOD;
}
void Citeste()
{
int x, nr, sum, t;
f>>t;
while (t--)
{
f>>x;
Solve(x, nr, sum);
g<<nr<<" "<<sum<<"\n";
}
}
int main()
{
Ciur();
Citeste();
f.close();
g.close();
return 0;
}