Cod sursa(job #687957)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 22 februarie 2012 21:32:21
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#include<bitset>
#define mod 9973
#define lim 1000003
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bitset<lim>ok;
long long n,x,i,j;
long long prim[lim];
long long putere(long long n,long long p){
	long long r=1;
	while(p!=0){
		if(p%2)
			r=(n*r)%mod;
		n=(n*n)%mod;
		p/=2;
	}
	return r;
}
void ciur(){
	prim[-1]=1;
	prim[1]=2;
	for(i=3;i<=lim;i+=2){
		if(!ok[i]){
			prim[++prim[-1]]=i;
		    for(j=i+i;j<=lim;j+=i)
			   ok[j]=1;
			ok[i]=1;
		}
	}
}
void  sumNRdiv(long long x){
	long long exp,a1,a2,nrdiv,suma;
	suma=1;
	nrdiv=1;
	for(long long i=1;i<=prim[-1],prim[i]*prim[i]<=x;i++){
		if(x%prim[i]==0){
			exp=0;
			while(x%prim[i]==0){
				exp++;
				x/=prim[i];
			}
			nrdiv*=exp+1;
			a1=(putere(prim[i],exp+1)-1)%mod;
			a2=putere(prim[i]-1,mod-2)%mod;
			suma=(((suma*a1)%mod)*a2)%mod;
			
		}
	}
	if(x!=1){
		nrdiv*=2;
		suma=(suma*(x+1))%mod;
	}
	g<<nrdiv<<" "<<suma<<" "<<"\n";
}
int main (){
	f>>n;
	ciur();
	for(;n;n--){
		f>>x;
		sumNRdiv(x);
	}
	return 0;
}