Cod sursa(job #2335113)

Utilizator Nicolae11Mihaila Nicolae Nicolae11 Data 3 februarie 2019 16:48:02
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
// w[i] este 0 daca 2*i+1 e numar prim si 1 daca nu.
#include <fstream>
#define LL unsigned long long
#define M 9973
using namespace std;
ifstream f("ssnd.in"); ofstream g("ssnd.out");

LL t,nr,N,pr2[250000],S,Div;
bool w[500010];

void ciur()
{LL i,j;
	pr2[0]=2; nr=0;
	for(i=1;i<=500000;i++)
	{
		if(!w[i])
		{pr2[++nr]=2*i+1;
		 for(j=2*i*i+2*i;j<=500000;j+=2*i+1) w[j]=true;
		}
	}
}

inline LL pow(LL c, LL p)
{LL R=1;
 while(p>0)
	{if(p&1) R*=c;
	 c*=c;
	 p>>=1;
	}
 return R;
}

void factori()
{LL c,p,i,j;
 S=Div=1;
 for(i=0;pr2[i]*pr2[i]<=N && N>1;i++)
	{if(N%pr2[i]==0)
		{c=pr2[i]; p=0;
		 while(N%c==0) {N/=c; p++;}
			//LL p1=(pow(c,p+1)-1);
		 LL p1=0,p2=1;
		 for(j=0;j<=p;j++) {p1+=p2; p2=p2*c;}
			//LL p2= c-1;
			//S=S*p1/p2;
		 S*=p1; S%=M;
		 Div*=(p+1);
		}
	}
	if(N>1)
	{
		Div<<=1;
		S*=((1LL*(N+1)) % M);
		S%=M;
	}
}

int main()
{f>>t;
 ciur();
 while(t)
	{f>>N;
	 factori();
	 g<<Div<<" "<<S<<'\n';
	 t--;
	}
 g.close();	
}