Nu exista pagina, dar poti sa o creezi ...
Cod sursa(job #713162)
Utilizator | Data | 14 martie 2012 12:07:19 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.35 kb |
#include <algorithm>
#include<stdio.h>
#include <vector>
#include <bitset>
using namespace std;
#define pb push_back
#define DIM 1000005
#define MOD 9973
vector <int> prim;
bitset <DIM> viz;
long long n;
int t,nd,sd;
void init ()
{
int i,j;
for (i=2; i<DIM; ++i)
if (!viz[i])
{
prim.pb (i);
for (j=i+i; j<DIM; j+=i)
viz[j]=1;
}
}
inline int lgput (int n,int p)
{
int rez;
n%=MOD;
for (rez=1; p; p>>=1)
{
if (p&1)
rez=(rez*n)%MOD;
n=(n*n)%MOD;
}
return rez;
}
void solve ()
{
int d,e;
nd=sd=1;
for (d=0; 1LL*prim[d]*prim[d]<=n; ++d)
if (n%prim[d]==0)
{
for (e=0; n%prim[d]==0; n/=prim[d])
++e;
nd=(nd*(e+1))%MOD;
sd=(((sd*((lgput (prim[d],e+1)+MOD-1)%MOD))%MOD)*lgput (prim[d]-1,MOD-2))%MOD;
}
if (n>1)
{
nd=(2*nd)%MOD;
sd=(((sd*((lgput (n,2)+MOD-1)%MOD))%MOD)*lgput (n-1,MOD-2))%MOD;
}
printf ("%d %d\n",nd,sd);
}
int main ()
{
freopen ("ssnd.in","r",stdin);
freopen ("ssnd.out","w",stdout);
int i;
init ();
scanf ("%d",&t);
for (i=1; i<=t; ++i)
{
scanf ("%lld",&n);
solve ();
}
return 0;
}