Cod sursa(job #2355347)

Utilizator marian013Giugioiu Marian Constantin marian013 Data 25 februarie 2019 23:34:33
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
long long n;
int t,k,P[1000005],mod=9973,i;
bitset <1000005> viz;
void ciur() {
	for(int i = 2; i < 1000005; ++i) {
		if(viz[i] == 0) {
			P[++k] = i;

			for(int j = i+i; j < 1000005; 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;
    for(i=1;i<=k&&1ll*P[i]*P[i]<=n;i++)
        if(n%P[i]==0)
    {
        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()
{
    ciur();
    f>>t;
    for(i=1;i<=t;i++)
    {
        f>>n;
        solve();
    }
}