Cod sursa(job #2277081)

Utilizator HoratioHoratiu Duma Horatio Data 5 noiembrie 2018 19:37:04
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <cstdio>
#include <bits/stdc++.h>
#define big 1000000
#define MOD 9973
using namespace std;

long sir[1000000];
long prime[100000];
int lp=0;
int t;

int ldesc=-1;

struct factori
{
    long factor;
    long putere;
}desc[100000];


pair<long, long> inversmod(int a, int b)
{
	if (b == 0)
		return { 1, 0 };
    pair <long,long>p = inversmod(b, a % b);
	return { p.second,  p.first - a / b * p.second };
}

void genciur()
{
    for(int i=3;i<big;i+=2)
        if(!sir[i])
        {
        prime[++lp]=i;
        for(int j=2*i;j<=big;j+=i)
            sir[j]=1;
        }
    prime[0]=2;
}

long logp(long p,long n)
{
    long t=1;
    while(p>1)
    {
        if(p%2==1)
        {
            t=(t % MOD)*(n % MOD);
            p--;
        }
        n=(n*n)%MOD;
        p/=2;
    }
    return (n*t)%MOD;
}

void calcul()
{
    long n;
    ldesc=-1;
    scanf("%ld",&n);
        for(int i=0;i<lp && n!=1;i++)
            if(n%prime[i]==0)
            {
            desc[++ldesc].factor=prime[i];
            desc[ldesc].putere=0;
            while(n%prime[i]==0)
            {
                n/=prime[i];
                desc[ldesc].putere++;
            }
            }
    int nrdiv=1;
    for(int i=0;i<=ldesc;i++)
        nrdiv*=desc[i].putere+1;
    printf("%ld ",nrdiv);

    long sumadiv=1;
    for(int i=0;i<=ldesc;i++)
    {
        if((desc[i].factor-1)!=0)
            {
            sumadiv*=(logp(desc[i].putere+1,desc[i].factor)-1);
            sumadiv=sumadiv % MOD;

            long a=inversmod((desc[i].factor-1),MOD).first;
            while(a<0)
                a+=MOD;
            sumadiv*=a%MOD;

            sumadiv=sumadiv % MOD;
            }
        else
            sumadiv*=desc[i].putere+1;
    }
    printf("%ld\n",sumadiv);

}


void prelucrare()
{
    scanf("%d",&t);

    for(int i=0;i<t;i++)
    {
     calcul();
    }
}









int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    genciur();
    prelucrare();

    return 0;
}