Pagini recente » Borderou de evaluare (job #2394306) | Cod sursa (job #626887)
Cod sursa(job #626887)
//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(int &suma,int &nr, long long n) {
int p;
int 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=(1LL*suma*(q-1)/(prim[i]-1))%modulo;
i++;
}
if (n>1) {
nr*=2;
suma = (1LL*suma*(n+1)) % modulo;
}
}
int main() {
int t;
long long n;
int 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,"%d %d\n",nr,suma);
}
fclose(fin);
fclose(fout);
return 0;
}