Pagini recente » Cod sursa (job #1820708) | Cod sursa (job #1872426) | Cod sursa (job #1407391) | Cod sursa (job #2610950) | Cod sursa (job #626886)
Cod sursa(job #626886)
//numarul divizorilor si suma lor
#include <stdio.h>
#define nmax 1000010
#define modulo 9973
bool v[nmax];
int prim[nmax/2],k=0;
void ssnd(long long &suma,long long &nr, long long n) {
long long p;
long long i=0,q=1;
nr=1;
suma=1;
while((1LL*prim[i]*prim[i])<=n) {
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;
i++;
}
if (n>1) {
nr*=2;
suma = (suma*(n+1)) % modulo;
}
}
int main() {
int t;
long long n;
long long 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; j<nmax; j+=i)
v[j]=1;
}
i++;
}
FILE *fin=fopen("ssnd.in","r");
FILE *fout=fopen("ssnd.out","w");
fscanf(fin,"%d",&t);
for(i=0; i<t; i++) {
fscanf(fin,"%lld",&n);
ssnd(suma,nr,n);
fprintf(fout,"%lld %lld\n",nr,suma);
}
fclose(fin);
fclose(fout);
return 0;
}