Cod sursa(job #626973)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 28 octombrie 2011 18:30:41
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;

int n,t,x,nr,suma,d,p,aux,i,ok,mod=9973;
bitset<1000010> pr;
vector<int> PR;

void read(),solve(),ciur();

int main()
{
	read();
	solve();
	return 0;
}

void read()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d",&t);
}

void solve()
{

	vector<int>::iterator it;
	ciur();
	for(;t;t--)
	{
		nr=1;suma=1;ok=0;
		scanf("%d",&x);
		n=x;
		for(it=PR.begin();it!=PR.end();it++)
		{
			p=*it;
			if(p*p>n)break;
			if(pr[n]==0){printf("2 %d\n",(1+n)%mod);ok=1;break;}
			d=0;
			while(x%p==0){d++;x/=p;}
			nr*=(d+1);
			aux=1;
			for(i=0;i<=d;i++)aux*=p;
			suma*=(aux-1)/(p-1);suma%=mod;
		}
		if(!ok)printf("%d %d\n",nr,suma);
	}
}
void ciur()
{
	PR.push_back(2);
	for(i=4;i*i<=1000010;i+=2)pr[i]=1;
	for(int i=3;i*i<=1000000;i+=2)
	{
		if(pr[i]==0)
		{
			PR.push_back(i);
			for(int j=i*i;j<=1000010;j+=i)
				pr[j]=1;
		}
	}
}