Pagini recente » Cod sursa (job #689246) | Cod sursa (job #946727) | Cod sursa (job #1360636) | Cod sursa (job #2534251) | Cod sursa (job #2278284)
#include <iostream>
#include <fstream>
#include <vector>
#define mod 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
vector<int>prime;
int n, x, numar,inm, suma=1;
bool ciur[1000005];
///s=1*(2^n-1)/2-1
void ciur_fct()
{
ciur[0]=1;
ciur[1]=1;
for (int i=2; i<=1000000; i++)
{
if (!ciur[i])
{
prime.push_back(i);
int mult=2*i;
while (mult<=1000000)
ciur[mult]=1,mult+=i;
}
}
}
int ridicare_putere(int x, int nr)
{
int st=1, dr=x;
while (nr)
{
if (nr%2==0)
{
dr=dr*dr;
dr%=mod;
nr/=2;
}
else
{
st*=dr;
st%=mod;
nr--;
}
}
return st;
}
void invers_mod(int a, int b, int &k, int &l)
{
if (b==0)
{
k=1;
l=0;
return;
}
int kp, lp;
invers_mod(b,a%b,kp,lp);
k=lp;
l=kp-lp*(a/b);
}
int prog_geom(int x, int nr)
{
int sus=ridicare_putere(x,nr)-1;
if (sus<0)
sus+=mod;
int jos=(x-1)%mod;
if (jos<0)
jos+=mod;
int k, p;
if (jos==0)
return nr%mod;
invers_mod(jos,mod, k, p);
if (k<0)
k+=mod;
return (sus*k)%mod;
}
int numar_div(int val)
{
numar=1;
int lungime=prime.size();
for (int i=0; i<lungime; i++)
{
if (i>val)
break;
inm=0;
while (val%prime[i]==0)
{
val/=prime[i];
inm++;
}
if (inm)
{
suma=suma*prog_geom(prime[i],inm+1);
suma%=mod;
}
numar*=(inm+1);
}
if (numar==1)
numar=2;
return numar;
}
int main()
{
ciur_fct();
f >> n;
for (int i=1; i<=n; i++)
{
suma=1;
f >> x;
g << numar_div(x) <<' ';
g << suma <<'\n';
}
return 0;
}