Cod sursa(job #568876)

Utilizator S7012MYPetru Trimbitas S7012MY Data 31 martie 2011 19:38:43
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define DN 1000005
#define REST 9973
using namespace std;

typedef vector<int>::iterator it;
vector<int> pr;
bitset<DN> isp;
ofstream g("ssnd.out");
int n;

void c() {
    for(int i=2; i<=DN; ++i)
        if(0==isp[i]) {
            pr.push_back(i);
            for(int j=i+i; j<=DN; j+=i) isp[j]=1;
        }
}

int lgput(int b, int exp) {
    int r=1;
    for(;exp;) {
        if(exp&1) {
            r*=b;
            --exp;
        }
        else {
            b*=b;
            exp/=2;
        }
        r%=REST;
    }
    return r;
}

void snd() {
    vector<int> f,p;
    for(it i=pr.begin();(*i)*(*i)<=n && i!=pr.end();++i) if(0==n%(*i)) {
        f.push_back(*i);
        p.push_back(0);
        it j=p.end(); --j;
        for(;0==n%(*i); ++(*j),n/=(*i));
       // cout<<(*i)<<' '<<(*j)<<'\n';
    }
    if(1!=n) {
        f.push_back(n);
        p.push_back(1);
    }
    int nrd=1;
    for(int i=0; i<f.size(); ++i) {
        nrd*=(p[i]+1);
        nrd%=REST;
    }
    g<<nrd<<' ';
    nrd=1;
    for(int i=0; i<f.size(); ++i) {
        nrd*=((lgput(f[i],p[i]+1)-1)/(f[i]-1));
        nrd%=REST;
    }
    g<<nrd<<'\n';

}

int main()
{
    ifstream f("ssnd.in");
    int t;
    c();
    for(f>>t;t;--t) {
        f>>n;
        snd();
        //cout<<"//////"<<endl;
    }
    return 0;
}