Cod sursa(job #609359)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 20 august 2011 21:24:47
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");


long long n,nmax=1000005;
bool ciur[1000005];
int pr[1000005],pri,ci,cj,k,t,ti,m=9973,i,d1,card,suma,t1,t2;

int pow (int b, int p) {
    int r=1,i;
    b%=m;
    for (i=1;i<=p;i<<=1) {
        if (p&i) r=r*b%m;
        b=b*b%m;
    }
    return r;
}

int main() {
    ciur[1]=true;pri=0;
    for (ci=2;ci<nmax-1;ci++){
        if(ciur[ci]==false) {
            pr[++k]=ci;
            for (cj=ci+ci;cj+1<nmax;cj+=ci)
                ciur[cj]=true;
        }
    }
    f >> t;
    for (ti=1;ti<=t;ti++) {
        f >> n;card=1;suma=1;
        for (pri=1;pri<=k&&1LL*pr[pri]*pr[pri]<=n;pri++){
            if (n%pr[pri]==0) {
             d1=0;
             while (n%pr[pri]==0) {d1++;n/=pr[pri];}
             card*=(d1+1);
             t1=(pow(pr[pri],d1+1)-1)%m;
             t2=(pow(pr[pri]-1,m-2))%m;
             suma=(((suma*t1)%m)*t2)%m;
            }

        }
        if (n>1) {
            card*=2;
            suma=1LL*suma*(n+1)%m;
        }
        g << card << ' ' << suma << '\n';
    }
    f.close();g.close();
    return 0;
}