Cod sursa(job #1745112)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 21 august 2016 12:08:43
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
#include<math.h>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t,i,v[1000005],prime[1000005],nrp,sum,modulo=9973,m,k,d,v1,v2;
long long nrd,n;
void erat(){
    int i,k,j;
    for (i=4;i<=1000000;i+=2)
        v[i]=1;
    nrp++;
    prime[nrp]=2;
    for (i=3;i<=1000000;i+=2)
      if (v[i]==0){
         nrp++;
         prime[nrp]=i;
         k=i*2;
         for (j=k;j<=1000000;j+=i)
            v[j]=1;
      }
}
int exp(int a,int b){
    int val;
    if (b==0) return 1;
    if (b%2==0){
        val=exp(a,b/2)%modulo;
        return ((val%modulo)*(val%modulo))%modulo;
    }
    val=exp(a,b-1)%modulo;
    return ((a%modulo)*(val%modulo))%modulo;
}
int main(){
    erat();
    fin>>t;
    for (i=1;i<=t;i++){
        fin>>n;
        k=1;nrd=1;sum=1;
        while(k<=nrp && 1LL*prime[k]*prime[k]<=n){
            if (n%prime[k]==0){
                 d=0;
                 while(n%prime[k]==0){
                    n=n/prime[k];
                    d++;
                 }
                 nrd=nrd*(d+1);
                 v1=(exp(prime[k],d+1)%modulo-1)%modulo;
                 v2=(exp(prime[k]-1,modulo-2)%modulo);
                 sum=(((sum*v1)%modulo)*v2)%modulo;
            }
            k++;
        }
        if (n>1){
            nrd=nrd*2;
            sum=(sum*((n+1)%modulo))%modulo;
        }
        fout<<nrd<<" "<<sum<<'\n';
    }
    fin.close();
    fin.close();
    return 0;
}