Cod sursa(job #1495860)

Utilizator LurchssLaurentiu Duma Lurchss Data 3 octombrie 2015 19:20:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <math.h>

#define max_n 1000003
#define mod 9973
using namespace std;

FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");
int n;
bitset<max_n> viz;
int k,prim[max_n],t;
vector<pair<int,int> > v;

int nr;
int lgput(int x,int p)
{
    int rez=1;
    x%=mod;
    for(;p;p>>=1)
    {
        if(p & 1)
        {
            rez*=x;
            rez%=mod;
        }
        x*=x;
        x%=mod;
    }
    return rez;
}

void ciur()
{
    for(int i=2;i<max_n;i++)
    {
        if(viz[i]==0)
            {
                prim[++k]=i;
                for(int j=i+i;j<=max_n;j+=i)
                viz[j]=1;
                }
    }
}
void solve()
{
    fscanf(g,"%d ",&t);
    int nd=1,sd=1;
    for(int i=1;i<=k && prim[i]*prim[i]<=t;i++)
    {
        if(t % prim[i])
            continue;
        int p=0;
        while(t%prim[i]==0)
            p++,t/=prim[i];
        nd*=(p+1);
        int p1,p2;
        p1=(lgput(prim[i],p+1)-1)%mod;
        p2=(lgput(prim[i]-1,mod-2))%mod;

        sd = (((sd*p1)%mod)*p2)%mod;
    }
    if(t>1)
       {
        nd*=2;
        sd= (sd*(n+1))%mod;}
    fprintf(f,"%d %d\n",nd,sd);
}
int main()
{
    fscanf(g,"%d ",&n);
    ciur();
    for(int i=1;i<=n;i++)
        solve();
    return 0;
}