Cod sursa(job #1995109)

Utilizator DawlauAndrei Blahovici Dawlau Data 26 iunie 2017 23:21:36
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<bitset>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD=9973;
bitset<1000005>ciur;
unsigned long long prim[80000],k;
void c(){
    int n=1000000,i,j;
    ciur[0]=ciur[1]=1;
    for(i=4;i<=n;i+=2)
        ciur[i]=1;
    for(i=3;i*i<=n;i+=2)
        if(!ciur[i])
            for(j=i*i;j<=n;j+=i)
                ciur[j]=1;
    prim[++k]=2;
    for(i=3;i<=n;i+=2)
        if(!ciur[i])
            prim[++k]=i;
}
unsigned long long pwr(unsigned long long a,unsigned long long n){
    if(n==1)
        return a;
    else{
        if(n%2==0)
            return pwr(a,n/2)*pwr(a,n/2);
        else
            return a*pwr(a,n-1);
    }
}
pair<int,int> divs(unsigned long long n){
    unsigned long long nrdiv=1,sumdiv=1,cnt,i=3;
    if(n%2==0){
        cnt=0;
        while(n%2==0){
            ++cnt;
            n/=2;
        }
        nrdiv*=(cnt+1);
        sumdiv*=(pwr(2,cnt+1)-1)%MOD;
    }
    for(i=1;i<=k&&1LL*prim[i]*prim[i]<=n;++i)
        if(n%prim[i]==0){
            cnt=0;
            while(n%prim[i]==0){
                n/=prim[i];
                ++cnt;
            }
            nrdiv*=(cnt+1);
            sumdiv*=(pwr(prim[i],cnt+1)-1)/(prim[i]-1)%MOD;
        }
    if(n>1){
        nrdiv*=2;
        sumdiv*=(pwr(n,2))/(n-1)%MOD;
    }
    pair<unsigned long long,unsigned long long>a=make_pair(nrdiv,sumdiv%MOD);
    return a;
}
int main(){
    int t;
    fin>>t;
    c();
    while(t--){
        unsigned long long nr;
        fin>>nr;
        pair<unsigned long long,unsigned long long>a=divs(nr);
        fout<<a.first<<' '<<a.second<<'\n';
    }
}