Cod sursa(job #1398689)

Utilizator robx12lnLinca Robert robx12ln Data 24 martie 2015 12:48:03
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#define DIM (1<<20)
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long m=9973;
long long putere(long long x,int p){
    long long r=1;
    while(p!=0){
        if(p%2==1){
            r=x%m*r%m;
        }
        x=x%m*x%m;
        p/=2;
    }
    return r%m;
}
char w[DIM+10];
long long n,x,v[100000],e,nr,i,k,t,j,sum,a,b,b1;
pair<int,int> d[100000];
int main(){
    for(i=2;i<=DIM;i++){
        if(w[i]==0){
            v[++k]=i;
            for(j=i+i;j<=DIM;j+=i){
                w[j]=1;
            }
        }
    }
    for(fin>>t;t!=0;t--){
        fin>>n;
        //numar divizori
        x=n;
        nr=1;
        k=0;
        for(i=1;v[i]*v[i]<=n && x!=1;i++){
            e=0;
            while(x%v[i]==0){
                e++;
                x/=v[i];
            }
            if(e!=0){
                d[++k].first=v[i];
                d[k].second=e;
                nr*=(e+1);

            }
        }
        if(x!=1){
            d[++k].first=x;
            d[k].second=1;
            nr*=2;
        }
        fout<<nr<<" ";
        //
        //suma divizori
        sum=1;
        for(i=1;i<=k;i++){
            a=putere(d[i].first,d[i].second+1)-1;
            b=d[i].first-1;
            b1=putere(b,m-2);
            sum=(sum%m)*(a%m*b1%m)%m;
        }
        fout<<sum<<"\n";
        //
    }
    return 0;
}