Cod sursa(job #2461355)

Utilizator Octavian703Octavian Corbu Octavian703 Data 25 septembrie 2019 14:33:19
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;

    const int MAX_N=1000005;
    const int MOD=9973;
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");

    long long n;
    int t,k,P[MAX_N],i,j;
    bitset <MAX_N> viz;
    void ciur()
    {
        for(i=2;i<=MAX_N;i++)
        {
            if(viz[i]==0)
            {
                P[++k]=1;
            for(j=i+i;j<=MAX_N;j+=i)
            {
                viz[j]=1;
            }
            }
        }
    }
        inline int pow(int x, int p)
        {
            int rez=1;
            x%=MOD;
        for(;p;p>>=1)
        {
        if(p&1)
        {
        rez*=x;
        rez%=MOD;
		}
		x*=x;
		x%=MOD;
	}
	return rez;
        }

    void solve()
    {
        int nd=1,sd=1,n,k;
        for(int i=1;i<=k&&1LL*P[i]*P[i]<=n;++i)
        {
		if(n%P[i])
            continue;
		int p=0;
		while(n%P[i]==0)
		{
			n/=P[i];
			p++;
		}
		nd*=(p+1);
		int p1=(pow(P[i],p+1)-1)%MOD;
		int p2=pow(P[i]-1,MOD-2)%MOD;
		sd =(((sd*p1)%MOD)*p2)%MOD;

        }

    if(n>1)
    {
        nd*=2;
        sd=(1LL*sd*(n+1))%MOD;
    }
    g<<nd<<" "<<sd<<"\n";

    }





int main()
{
    int T;
    ciur();
    for(f>>T;T;T--)
        solve();
    return 0;
}