Cod sursa(job #2498274)

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

using namespace std;

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

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

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

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