Pagini recente » Cod sursa (job #1083461) | Cod sursa (job #808590) | Cod sursa (job #927694) | Cod sursa (job #927383) | Cod sursa (job #1220999)
#include <fstream>
#include <list>
#include <cmath>
#include <bitset>
#define DIM 1000000
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int T,x;
list<int> P;
list<int>::iterator it;
bitset<DIM+11> viz;
void eratostenes(){
for(register int i=2;i<DIM;i++)
if(!viz[i]){
P.push_back(i);
for(register int j=i+i;j<DIM;j+=i) viz[j]=1;
}
}
int nrdiv(int x){
int nr=1,q,y=x;
for(it=P.begin();it!=P.end();it++){
if(*it>sqrt(y))
break;
q=0;
while(x%(*it)==0){
x/=*it,q++;
}
nr*=(q+1);
}
if(x!=1) nr*=2;
return nr;
}
int p(int a,int &b){
int nr=0;
while(b%a==0)
nr++,b/=a;
return nr;
}
int up(int a,int b){
if(b==1)
return a;
else{
int q=up(a,b/2);
q%=MOD;
q*=q,q%=MOD;
if(b%2==1) q*=a,q%=MOD;
return q;
}
}
int invmod(int x){
return up(x,MOD-2);
}
int sumdiv(int x){
int sum=1,a,b,y=x;
for(it=P.begin();it!=P.end() && x!=1;it++){
if(x%(*it))
continue;
b=p(*it,x);
a=up(*it,b+1)-1;
if(a<0) a+=MOD;
b=invmod(*it-1);
sum*=(a*b)%MOD,sum%=MOD;
}
return sum;
}
int main(void){
register int i,j;
eratostenes();
f>>T;
for(;T;T--){
f>>x;
g<<nrdiv(x)<<" "<<sumdiv(x)<<"\n";
}
return 0;
}