Cod sursa(job #616017)

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

using namespace std;

long long n;
int t,cnt,v[100005];
bitset <1000005> u;

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

int main()
{
	int i,nd,sd,p,p1,p2;
	ifstream fin("ssnd.in");
    ofstream fout("ssnd.out");
	for(i=2;i<1005;++i)
		if(!u[i])
		{
			v[++cnt]=i;
			for(int j=i<<1;j<1000005;j+=i)
				u[j]=1;
		}
    for (;i<1000005;++i)
        if (!u[i])
            v[++cnt]=i;
    fin>>t;
	for(;t;--t)
	{
        fin>>n;
        nd=1;
        sd=1;
        for(i=1;i<=cnt&&1LL*v[i]*v[i]<=n;++i)
            if (n%v[i]==0)
            {
                p=0;
                while(n%v[i]==0)
                {
                    n/=v[i];
                    ++p;
                }
                nd*=(p+1);
                p1=(pow(v[i],p+1)-1)%9973;
                p2=pow(v[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";
	}
}