Nu aveti permisiuni pentru a descarca fisierul grader_test35.in
Cod sursa(job #1360144)
Utilizator | Data | 25 februarie 2015 12:04:37 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.69 kb |
#include<fstream>
#include<cmath>
#include<bitset>
using namespace std;
#define N 1000001
#define MOD 9973
bitset<N> era;
unsigned int prime[N], np;
void ciurul()
{
unsigned int i, j, s = sqrt(N) + 1;
for(i = 2; i <= s; i++)
if(!era[i])
for(j = i*i; j <= N; j += i)
era[j] = 1;
for(i=2; i<= N; i++)
if(!era[i])
prime[np++] = i;
}
unsigned int _pow(unsigned long long a, unsigned long long b)
{
char i;
unsigned int rez = 1;
for(i=0; ((unsigned long long)1<<i) <= b; i++)
{
if((1<<i) & b)
rez = rez*a;
a = a*a;
}
return rez;
}
int main()
{
unsigned long long t, i, j, nrdiv, sdiv, d, nr, cp, rad;
fstream in("ssnd.in", fstream::in);
fstream out("ssnd.out", fstream::out);
ciurul();
in>>t;
for(i=0; i<t; i++)
{
nrdiv = 1;
sdiv = 1;
in >> nr;
j = 0;
cp = nr;
rad = sqrt(nr) + 1;
while(nr>1 && j < np && prime[j] <= rad)
{
d = 0;
while(nr%prime[j] == 0 && nr && prime[j] <= rad)
{
nr /= prime[j];
d++;
}
if(d)
{
nrdiv = nrdiv*(d+1)%MOD;
if(d==1)
sdiv = sdiv*(prime[j]+1)%MOD;
else
sdiv = sdiv*(_pow(prime[j], d+1)-1)/(prime[j] - 1)%MOD;
}
j++;
}
if(nr == cp)
out<<2<<' '<<(1+nr)<<'\n';
else
out<<nrdiv<<" "<<sdiv<<'\n';
}
in.close();
out.close();
}