Cod sursa(job #1478660)

Utilizator SilviuIIon Silviu SilviuI Data 29 august 2015 10:22:36
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <bitset>
#define mod 9973
#define nmax 1000010
using namespace std;
int n,i,j,prim[100500],nr,k,xx,y,z;
long long x,sumd,sol,nrdiv;
bitset <nmax> fr;
void gcd(int a,int b)
{
    if (b==0) { xx=1; y=0; return; } else
    {
        gcd(b,a%b);
        z=xx; xx=y;
        y=z-(a/b)*xx;
    }
}
int invers(int x)
{
    xx=0; y=0; gcd(x,mod);
    while (xx<0) xx=xx+mod;
    return xx;
}
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])%mod; sol=sol*((sumd-1)*invers(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;
}