Cod sursa(job #1231514)

Utilizator afkidStancioiu Nicu Razvan afkid Data 20 septembrie 2014 20:21:31
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#define sDIMN 1000005
#define mod 9973

using namespace std;

int t,sum,nrDiv,v[sDIMN];
bool check[sDIMN];

inline int pow(int x,int p)
{
    int res=1;
    x%=mod;
    for(;p;p>>=1)
    {
        if(p & 1){
           res*=x;
           res%=mod;
        }
        x*=x;
        x%=mod;
    }
    return res;
}

int main()
{
    long long n;
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");
    int dim=1;
    v[1]=2;
    for(int i=3;i<sDIMN;i+=2)
    {
        if(check[i]==true)
            {
                for(int j=i+i+i;j<sDIMN;j+=(i<<1))
                    check[j]=false;
                v[++dim]=i;
            }
    }
    in >> t;
    while(t!=0)
    {
        in>>n;
        nrDiv=1;
        sum=1;
        for(int i=1;v[i]*v[i]<=n && i<=dim;++i)
        {
        if(n%v[i]==0)
        {
            int cnt=0;
            while(n%v[i]==0)
            {
                n/=v[i];
                cnt++;
            }
            nrDiv*=cnt+1;
            int t1=(pow(v[i],cnt+1)-1)%mod;
            int t2=pow(v[i]-1,mod-2)%mod;
            sum=(((sum*t1)%mod)*t2)%mod;
        }
        }
        if (n > 1)
        {
            nrDiv*=2;
            sum = (sum*(n*n-1)/(n-1))%mod;
        }
        out << nrDiv<<" "<< sum<<endl;
        t--;
    }
    return 0;
}