Cod sursa(job #616014)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 11 octombrie 2011 15:55:20
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

long long n;
int t,K,P[100005];
bitset <1000005> viz;

int pow(int x,int p)
{
	int rez=1;
	x%=9973;
	for(;p;p>>=1)
	{
		if(p&1)
		{
			rez*=x;
			rez%=9973;
		}
		x*=x;
		x%=9973;
	}
	return rez;
}

int main()
{
	int i;
	for(i=2;i<1000005;++i)
		if(viz[i]==0)
		{
			P[++K]=i;
			for(int j=i<<1;j<1000005;j+=i)
				viz[j]=1;
		}
    fin>>t;
	for(;t;--t)
	{
        fin>>n;
        int	nd=1,sd=1,i,p,p1,p2;
        for(i=1;i<=K&&1LL*P[i]*P[i]<=n;++i)
        {
            if (n%P[i])
                continue;
            p=0;
            while(n%P[i]==0)
            {
                n/=P[i];
                ++p;
            }
            nd*=(p+1);
            p1=(pow(P[i],p+1)-1)%9973;
            p2=pow(P[i]-1,9973-2)%9973;
            sd=(((sd*p1)%9973)*p2)%9973;
        }
        if(n>1)
        {
            nd*=2;
            sd=(1LL*sd*(n+1)%9973);
        }
        fout <<nd<<" "<<sd<<"\n";
	}
}