Cod sursa(job #1753975)

Utilizator alisavaAlin Sava alisava Data 7 septembrie 2016 13:21:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define P 9973
using namespace std;

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

bitset<1000005>a;
int p[80000],k;
void Ciur(int n)
{
    int i,j;
    for(i=4;i<=n;i=i+2)
        a[i]=1;
    for(i=3;i*i<=n;i=i+2)
        if(a[i]==0)
            for(j=i*i;j<=n;j=j+2*i) a[j]=1;
    for(i=2;i<=n;i++)
        if(a[i]==0)
            p[++k]=i;
}
int RidPutere(int a,int x)
{
    int prod=1;
    while(x!=0)
    {
        if(x%2==1)
        {
            x--;
            prod=(1LL*a*prod)%P;
        }
        a=(1LL*a*a)%P;
        x=x/2;
    }
    return prod;
}
int main()
{
    Ciur(1000000);
    int t;
    long long n, sum=1, y;
    int d,i,f[40],nrf,e,nrd,expo[40];
    fin>>t;
    for(int ii=1;ii<=t;ii++)
    {
        fin>>n;
        d=2;i=1;
        nrd = 1;
        nrf = 0;
        while(n>1&&d*d<=n&&i<=k)
        {
            if(n%d==0)
            {
                f[++nrf]=d;
                e=0;
                while(n%d==0)
                {
                    e++;
                    n=n/d;
                }
              nrd=nrd*(e+1);
              expo[nrf]=(e+1);
            }
            d=p[++i];
        }
        if(n>1)
        {
            f[++nrf]=n;
            nrd=nrd*2;
            expo[nrf]=2;
        }
        sum = 1;int fa;
        for(i = 1; i <= nrf; i++)
        {
        fa = f[i];
        e = expo[i];
        y =RidPutere(fa, e)%P;
        y--;
        if(y==-1)
            y=9972;
        sum =(1LL*sum*y)%P;
        sum =(1LL*sum*(RidPutere(fa-1, P-2)%P))%P;
        }
         fout << nrd << " "<< sum << "\n";

    }
    return 0;
}