Pagini recente » Istoria paginii runda/lasm_baraj_cl11-12 | Cod sursa (job #773969) | Cod sursa (job #1865744) | Cod sursa (job #970518) | Cod sursa (job #626840)
Cod sursa(job #626840)
//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 int &suma,long int &nr, long int n){
long int p;
long int i=0,q=1;
nr=1;
suma=1;
while((((long int)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 int n;
long 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,"%ld",&n);
ssnd(suma,nr,n);
fprintf(fout,"%ld %ld\n",nr,suma);
}
fclose(fin);
fclose(fout);
return 0;
}