Pagini recente » Cod sursa (job #199187) | Cod sursa (job #1461908) | Cod sursa (job #1689006) | Cod sursa (job #2882107) | Cod sursa (job #993267)
Cod sursa(job #993267)
#include <fstream>
#include <vector>
#include <cmath>
using std::vector;
const int NR_PRIMES_BELOW_ONE_MILION=78498;
const int MODULO=9973; //it is a prime
void calc_primes(vector<unsigned> &primes,vector<bool> &ciur,unsigned limit){
primes[0]=2;
unsigned c=1;
ciur[0]=false;
for(unsigned i=3;i<limit;i+=2)
if(ciur[i>>1]){
primes[c++]=i;
for(unsigned j=3;j*i<limit;j+=2) ciur[(i*j)>>1]=false;
}
}
int main(){
std::ifstream fin("ssnd.in");
std::ofstream fout("ssnd.out");
short t;
fin>>t;
vector<unsigned> primes(NR_PRIMES_BELOW_ONE_MILION);
vector<bool> ciur(500000,true);
calc_primes(primes,ciur,1000000);
while(t--){
unsigned n,sqrtn;
fin>>n; sqrtn=std::sqrt(n);
unsigned long long nrdiv=1,sumdiv=1;
for(unsigned i=0;primes[i]<=sqrtn;++i){
unsigned p=primes[i];
if(n%p==0){
unsigned d=0;
while(n%p==0){ ++d; n/=p; }
nrdiv=(nrdiv*(d+1))%MODULO;
sumdiv=( sumdiv * (static_cast<int>(std::pow(p,d+1))-1) / (p-1) )%MODULO;
}
}
if( n==2 || ((n&1)&&ciur[n>>1]) ){nrdiv+=1;sumdiv+=n;}
fout<<nrdiv<<' '<<sumdiv<<'\n';
}
}