Cod sursa(job #1170813)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 14 aprilie 2014 17:15:50
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <bitset>

using namespace std;

const long long mod = 9973;

long long t,i,n,c,p,sol1,sol2,j,nr,x,y;

bitset<1000005> ciur;

long long prime[500005];

void euclid(long long a, long long b, long long &x, long long &y) {
    if(b==0) {
        x=1;
        y=0;
        return;
    }
    long long xa,ya;
    euclid(b,a%b,xa,ya);
    x=ya;
    y=xa-(a/b)*ya;
}

int main() {
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    f>>t;
    ciur[1]=1;
    for(i=2;i<=1000001;i++) {
        if(ciur[i]==0) {
            prime[++n]=i;
            for(j=i+i;j<=1000001;j+=i)
                ciur[j]=1;
        }
    }
    while(t--) {
        f>>nr;
        sol1=sol2=1;
        for(i=1;i<=n && prime[i]*prime[i]<=nr;i++) {
            c=0;p=1;
            while(nr%prime[i]==0)
                nr/=prime[i],c++,p=(p*prime[i])%mod;
            if(p>1) {
                p=(p*prime[i])%mod;
                p--;
                if(p<0)
                    p+=mod;
                euclid(mod,prime[i]-1,x,y);
                if(y<0)
                    y=(y+mod*((0-y)/mod+1))%mod;
                sol2=(sol2*y*p)%mod;
            }
            sol1*=(c+1);
        }
        if(nr!=1) {
            p=nr;
            if(p>1) {
                p=(p*nr)%mod;
                p--;
                if(p<0)
                    p+=mod;
                euclid(mod,nr-1,x,y);
                if(y<0)
                    y=(y+mod*((0-y)/mod+1))%mod;
                sol2=(sol2*y*p)%mod;
            }
            sol1*=2LL;
        }
        g<<sol1<<" "<<sol2<<"\n";
    }
    return 0;
}