Cod sursa(job #2348198)

Utilizator mateibanuBanu Matei Costin mateibanu Data 19 februarie 2019 14:48:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

#define MOD 9973
#define ll long long

bitset<1000010>ciur;
int prime[100010],p,d;
int sus, jos, dv;

/*int inv(int x, int n){
    if (n==0) return 1;
    if (n==1) return x;
    ll y=inv(x,n/2);
    y=(y*y)%MOD;
    if (n%2==1) y=(y*x)%MOD;
    return y;
}*/


inline int inv(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;
}

int main()
{
    int i,n,k,nr=0,j;
    ll x;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    for (i=2;i<1000005;i++){
        if (ciur[i]==0){
            prime[++nr]=i;
            for (j=2*i;j<1000005;j+=i)
                ciur[j]=1;
        }
    }
    scanf("%d",&n);
    while (n){
        n--;
        scanf("%lld",&x);
        k=0;
        sus=1;
        jos=1;
        dv=1;
        for (i=1;1LL*prime[i]*prime[i]<=x&&i<=nr;i++){
            if (x%prime[i]==0){
                p=prime[i];
                d=0;
                while (x%prime[i]==0){
                    x/=prime[i];
                    d++;
                }
                dv=(dv*(d+1))%MOD;
                sus=(sus*((inv(p%MOD,d+1)-1+MOD)%MOD))%MOD;
                jos=(jos*((p-1+MOD)%MOD))%MOD;
            }
        }

        if (x>1){
            dv=(dv*2)%MOD;
            sus=(sus*(x+1))%MOD;
        }
        jos=inv(jos%MOD,MOD-2);
        sus=(sus*jos)%MOD;
        printf("%d %d\n",dv,sus);
    }
    return 0;
}