Cod sursa(job #2498313)

Utilizator maria15Maria Dinca maria15 Data 23 noiembrie 2019 19:16:54
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <bitset>

using namespace std;

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

int t, a, b, c, nrdiv, sum, prime[100003], i, j, nrP;
long long n, m;
bitset<1000001> f;

int ridicare(int baza, int putere){
    if(putere == 0)
        return 1;
    int r1 = ridicare(baza, putere/2);
    int rezultat = (r1*r1)%9973;
    if(putere % 2 == 1)
        rezultat = rezultat*baza%9973;
    return rezultat;
}

int main(){
    f[0] = f[1] = 1;
    prime[nrP=1] = 2;
    for(i=3;i<=1000000;i+=2)
        if(f[i] == 0){
            prime[++nrP] = i;
            for(j=3*i;j<=1000000;j+=2*i)
                f[j] = 1;
        }
    fin>>t;
    while(t--){
        fin>>n;
        m = n;
        nrdiv = sum = 1;
        for(i=1;1LL*prime[i]*prime[i]<=n && i<=nrP && m>1;++i){
            if(m%prime[i] == 0){
                a = 0;
                while(m%prime[i] == 0 && m>1){
                    a++;
                    m /= prime[i];
                }
                nrdiv *= 1+a;
                b = ridicare(prime[i]%9973, a+1)-1;
                if(b<0)
                    b+=9973;
                c = ridicare((prime[i]-1)%9973, 9971);
                sum = ((b*c%9973)*sum)%9973;
            }
        }
        if(m > 1){
            nrdiv *= 2;
            b = 1LL*m*m%9973-1;
            if(b<0)
                b+=9973;
            c = ridicare((m-1)%9973, 9971);
            sum = ((b*c%9973)*sum)%9973;
        }
        fout<<nrdiv<<" "<<sum<<"\n";
    }
    return 0;
}