Cod sursa(job #409673)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 3 martie 2010 19:51:43
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <bitset>
using namespace std;
const int L=1000500;
bitset <L> m;
int p[100000],f[1000],w[1000];

int main(){
  freopen("ssnd.in","r",stdin);
  freopen("ssnd.out","w",stdout);
  int T,i,j,k,q;
  long long x,rez,r;
  //preprocessing
  p[1]=2;q=1;
  for (i=3;i<L;i+=2)if (!m[i]){p[++q]=i;for (j=3*i;j<L;j+=i<<1)m[j]=1;}
  //
  scanf("%d",&T);
  while (T--){
    scanf ("%lld\n",&x);
    j=1;k=0;
    while ((long long)p[j]*p[j]<=x){
      if (x%p[j]==0){
        f[++k]=p[j];w[k]=0;
        while (x%p[j]==0){x/=p[j];w[k]++;}
      }
      j++;
    }
    if (x>1){f[++k]=x;w[k]=1;}
    rez=1; for (i=1;i<=k;++i)rez*=w[i]+1; printf("%lld ",rez);
    rez=1; for (i=1;i<=k;++i){r=1;for (j=0;j<=w[i];++j)r*=f[i]; rez=rez*(r-1)/(f[i]-1);}
    printf("%lld\n",rez);
  }
return 0;
}