Cod sursa(job #716875)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 19 martie 2012 12:46:22
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <utility>
#define f first
#define s second
#define mp make_pair
using namespace std;
bool neprim[1000010];
int factor,suma,prime[300010],numar,nrf,k;
pair<int,int> euclid(int a,int b)
{
	pair<int,int>e;
	if(b==0) return mp(1,0);
	e=euclid(b,a%b);
	swap(e.f,e.s);
	e.s-=e.f*(a/b);
	return e;
}
void ciur()
{
	for(int i=2;i<=1000000;i++)
	if(!neprim[i])
	{
		prime[++k]=i;
		for(int j=2*i;j<=1000000;j+=i) neprim[j]=1; 
	}
}
int main()
{
	pair<int,int>e;
	int t,n,i;
	ifstream fi("ssnd.in");
	ofstream fo("ssnd.out");
	ciur();
	fi>>t;
	int mod=9973;
	while(t--)
	{
		fi>>n;
		int radical=(int)sqrt((double)n);
		numar=1; suma=1;
		for(i=1;i<=k and prime[i]<=radical and prime[i]<=n;i++)
		if(n%prime[i]==0)
		{
			nrf=0;
			factor=prime[i]%mod;
			while(n%prime[i]==0) { n/=prime[i]; nrf++; factor=(factor*prime[i])%mod; }
			factor--; if(factor<0) factor+=mod;
			e=euclid(prime[i]-1,mod);
			while(e.f<=0) e.f+=mod;
			suma=(suma*e.f)%mod;
			suma=(suma*factor)%mod;
			numar=(numar*(nrf+1))%mod;			
		}
		if(n!=1) 
		{
			numar=(numar*2)%mod;
			suma=(suma*(((n*n-1)/(n-1))%mod))%mod;
		}
		fo<<numar<<" "<<suma<<"\n";
	}
	
}