Cod sursa(job #700851)

Utilizator giuliastefGiulia Stef giuliastef Data 1 martie 2012 12:17:35
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <bitset>
#define NMAX 1000011
#define MOD 9973
using namespace std;
bitset <NMAX> viz;
long long N;
int T,K,P[NMAX];
void ciur(){
     int i,j;
     for(i=2;i<NMAX;i++)
             if(viz[i]==0){
              P[++K]=i;
              for(j=i+i;j<NMAX;j+=i)
               viz[j]=1;
             }
}
int Pow_(int x, int y){
     int sol,i;
     x=x%MOD;
     sol=1;
     for(i=0; (1<<i)<=y; i++){
              if( ((1<<i) & y)>0)
                   sol=(sol*x)%MOD;
              x=(x*x)%MOD;
     }
     return sol;
}
int main(){
    int nr,suma,p,p1,p2,i;
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");
    in>>T;
    ciur();
    for(;T>0;--T){
     in>>N;
     nr=1, suma=1;
     for(i=1;i<=K && 1LL*P[i]*P[i]<=N;i++){
         if(N%P[i]) continue;
         p=0;
         while(N%P[i]==0){
          N/=P[i]; 
          p++;
         }
         nr*=(p+1);
    	 p1 = (Pow_(P[i],p+1) - 1) % MOD;
		 p2 = Pow_(P[i]-1, MOD-2) % MOD;  
         suma=(((suma*p1)%MOD)*p2)%MOD;
     }
     if(N>1){
		nr*=2;
		suma=(1LL*suma*(N+1)%MOD);
	 }
     out<<nr<<" "<<suma<<"\n";
    }
    in.close();
    out.close();
    return 0;
}