Cod sursa(job #978781)

Utilizator andrettiAndretti Naiden andretti Data 29 iulie 2013 18:02:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#include<bitset>
#define maxd 1000005
#define maxp 80000
#define mod 9973
using namespace std;
typedef long long ll;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

int t,p,nrd,sum;
int prime[maxp];
ll n;
bitset <maxd> sieve;

void preproc()
{
    int i,lim=maxd-5;
    prime[++p]=2;
    for(i=3;i*i<=lim;i+=2)
      if(!sieve[i])
      {
          prime[++p]=i;
          for(int j=i;i*j<=lim;j++)
           sieve[i*j]=1;
      }
    for(;i<=lim;i+=2)
     if(!sieve[i])
      prime[++p]=i;
}

void solve()
{
    int nr;
    ll prod;

    fin>>t;
    for(int i=1;i<=t;i++)
    {
        fin>>n;
        nrd=1; sum=1;

        for(int j=1;1LL*prime[j]*prime[j]<=n;j++)
         if(n%prime[j]==0)
         {
             nr=0; prod=prime[j];
             while(n%prime[j]==0)
             {
                 nr++;
                 prod*=prime[j];
                 n/=prime[j];
             }
             nrd*=(nr+1); prod--;
             sum=( sum*(prod/(prime[j]-1))%mod )%mod;
         }

        if(n>1) nrd*=2,sum=(sum*((n+1)%mod))%mod;
        fout<<nrd<<" "<<sum<<'\n';
    }
}

int main()
{
    preproc();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}