Cod sursa(job #670860)
Utilizator | Data | 30 ianuarie 2012 11:55:36 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.11 kb |
#include <cstdio>
#include <bitset>
using namespace std;
bitset <1000000> ar;
unsigned long long prm[1212332];
unsigned long long a[1124312];
unsigned long long cif[123213];
unsigned long long pu[1231231];
int main(){
unsigned long long n,t,i,j,k,s,cp,cn,l,su,v,cnt=1;
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%lld",&t);
for(i=2;i*i<=500000;++i){
if(ar[i]==0){
prm[cnt++]=i;
for(j=i*i;j<=500000;j=j+i){
ar[j]=1;
}
}
}
a[1]=1;
for(k=1;k<=t;++k){
scanf("%lld", &n);
s=0;
cn=n;
cp=0;
j=0;
l=0;
su=0;
v=0;
for(i=1;cn>1;++i){
cp=0;
pu[v]=prm[i];
while(cn%prm[i]==0&&prm[i]>1){
cp++;
cn=cn/prm[i];
if(prm[i]!=cif[l-1]) cif[l++]=prm[i];
pu[v]=pu[v]*prm[i];
}
if(cp>0) {
a[j++]=cp;
v++;
}
}
cp=1;
for(i=0;i<j;++i){
cp=cp*(a[i]+1);
}
su=1;
for(i=0;i<j;++i){
su=su*((pu[i]-1)/(cif[i]-1));
su=su%9973;
}
printf("%lld %lld\n", cp, su);
for(i=0;i<=j;++i){
cif[i]=0;
pu[i]=0;
a[i]=0;
}
}
}