Cod sursa(job #2367684)

Utilizator mariastStoichitescu Maria mariast Data 5 martie 2019 11:56:14
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
int t,viz[1000110],nr[1000100],p;
long long n,numar,sum,q,k;
int putere(int a,int b){
    int x=1;
    a%=9973;
    while(b){
        if(b%2){
            x=(x*a)%9973;
            --b;
        }
        else{
            a=(a*a)%9973;
            b/=2;
        }
    }
    return x;
}
int main()
{
    for(int d=2;d<=1000001;++d){
        if(!viz[d]){
            nr[++k]=d;
            for(int j=d+d;j<1000001;j+=d)viz[j]=1;
        }
    }
    f>>t;
    for(int i=1;i<=t;++i){
        f>>n;
        numar=1;
        sum=1;
        q=1;
        while(nr[q]*nr[q]<=n&&q<=k){
            p=1;
            while(n%nr[q]==0){
                ++p;
                n/=nr[q];
            }
            if(p!=1){
                int val1=(putere(nr[q],p)-1)%9973;
                int val2=putere(nr[q]-1,9973)%9973;
                numar=numar*p;
                sum=(((sum*val1)%9973)*val2)%9973;
            }
            ++q;
        }
        if(n>1){
            sum=(sum*(n+1))%9973;
            numar=2*numar;
        }
        g<<numar%9973<<" "<<sum%9973<<'\n';
    }

}