Cod sursa(job #1478656)

Utilizator SilviuIIon Silviu SilviuI Data 29 august 2015 09:53:11
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>
#include <bitset>
#define mod 9973
#define nmax 1000010
using namespace std;
int n,i,j,prim[100500],nr,k;
long long x,sumd,sol,nrdiv;
bitset <nmax> fr;
int main() {
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%d",&n);
for (i=2;i*i<=nmax-10;i++)
    if (fr[i]==0) {
      for (j=i*i;j<=nmax-10;j+=2*i) fr[j]=1;
    }
nr++; prim[nr]=2;
for (i=3;i<=nmax-10;i+=2)
    if (fr[i]==0) nr++,prim[nr]=i;
for (i=1;i<=n;i++) {
    scanf("%lld",&x); j=1; nrdiv=1; sol=1;
    while (x>1 && j<=nr && 1LL*prim[j]*prim[j]<=x) {
        k=0; sumd=1;
        while (x%prim[j]==0) { k++; x=x/prim[j]; sumd=sumd*1LL*prim[j]%mod; }
        if (k>0) {
            nrdiv=nrdiv*1LL*(k+1); sumd=sumd*1LL*prim[j]; sol=sol*1LL*(sumd-1)/(prim[j]-1)%mod; }
        j++;
    }
    if (x>1) { nrdiv=nrdiv*2; sol=sol*(x*x-1)/(x-1)%mod; }
    printf("%lld %lld\n",nrdiv,sol);
}
return 0;
}