Cod sursa(job #607066)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 10 august 2011 18:10:21
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <bitset>

using namespace std;

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

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

inline int pow (int b, int p) {
    int r=1;long long x;
    b%=m;
    for (;p;p>>=1) {
        if (p&1) 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]==0) {
            pr[++k]=ci;
            for (cj=ci+ci;cj+1<nmax;cj+=ci)
                ciur[cj]=1;
        }
    }
    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]) continue;
             d1=0;
             while (n%pr[pri]==0) {d1++;n/=pr[pri];}
             card=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;
}