Cod sursa(job #2086978)

Utilizator MotoAMotoi Alexandru MotoA Data 12 decembrie 2017 18:59:59
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int MOD=9973;
int v[1000001],prim;

void ciur(int n) {
    for(int i=4; i<=n; i+=2)
        v[i]=1;
    for(int i=3; i<=n; i+=2)
        if(!v[i]) {
            for(int j=2*i; j<=n; j+=i)
                v[j]=1;
        }
    v[++prim]=2;
    for(int i=3; i<=n; i+=2)
        if(!v[i])v[++prim]=i;
}

int pow(int a,int b) {
    if(!b)return 1;
    if(b==1)return a%MOD;
    if(b%2==0)return pow(1LL*a*a%MOD,b/2)%MOD;
    return 1LL*a*pow(1LL*a*a%MOD,b/2)%MOD;
}

int invers_mod(int a) {
    return pow(a,MOD-2);
}

void suma_numar_div(long long n,int &s,int &nr) {
    long long p=0;
    s=nr=1;
    for(int i=1; i<=prim && n>1; i++)
        if(n%v[i]==0) {
            p=0;
            while(n%v[i]==0) {
                p++;
                n/=v[i];
            }
            nr*=1LL*(p+1)%MOD;
            nr%=MOD;
            s*=1LL*(pow(v[i],p+1)-1+MOD)%MOD*invers_mod(v[i]-1)%MOD;
            s%=MOD;
        }
}

void citire() {
    int t,s,nr;
    long long n;
    f>>t;
    while(t--) {
        f>>n;
        suma_numar_div(n,s,nr);
        g<<nr<<' '<<s<<'\n';
    }
}


int main() {
    ciur(1000000);
    citire();
   //for(int i=1;i<=200;i++)
    //g<<i<<'\n';
}