Cod sursa(job #2210099)

Utilizator b10nd3Oana Mancu b10nd3 Data 5 iunie 2018 16:56:39
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#include <bitset>
#include<math.h>

# define MAX 1000005
using namespace std;

const int MOD=9973;
bitset <MAX> isPrime;
//bool isPrime[MAX+1];
long long primes[MAX+1];
int k;


void ciurulLuiEratostene(){
	int i, j;
	for(i=2;i<=sqrt(MAX);i++){
		if(isPrime[i]==0){
			primes[++k]=i;
			for(j=i*i*1LL;j<=MAX;j+=i)
			    isPrime[j]=1;
		}
	}
	for(i=sqrt(MAX)+1; i<=MAX; i++)
	  if(isPrime[i]==0)  primes[++k]=i;
}


long long logAB(long long a,long long &n, long long &s){
	long long aux=a, auxN=n;
    long long p=0;
    s=1;
	while(n%aux==0){
	    s=(s+aux%MOD)%MOD;
		p++; 
		aux*=a*1LL;
		auxN=auxN/a;
   }
   n=auxN;
   return p;
}


int main(){
	FILE *in=fopen("ssnd.in","r"), *out=fopen("ssnd.out","w");
	int t, i, j; 
	long long n, d, nrDiv, sumDiv, s;
	
	ciurulLuiEratostene();		
	fscanf(in,"%i",&t); 
	for(i=1;i<=t;i++){
		fscanf(in,"%lld",&n);
		nrDiv=1, sumDiv=1;
		j=1;
		for(j=1; j<=k && 1LL*j*j<=n;j++){
			if(n%primes[j]==0){
				d=logAB(primes[j],n,s); 
				nrDiv*=(d+1)*1LL;
				sumDiv=1LL*sumDiv*(s%MOD)%MOD;
			}
		} 
		if(n>1)  {
		     nrDiv*=2*1LL;
			 sumDiv*=(1+n%MOD)*1LL%MOD;	
		}
		fprintf(out,"%lld %lld\n",nrDiv,sumDiv);
	} 

	fclose(in); fclose(out);
	return 0;
}