Mai intai trebuie sa te autentifici.
Cod sursa(job #981557)
Utilizator | Data | 7 august 2013 15:32:22 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.3 kb |
#include<fstream>
#include<algorithm>
#include<utility>
#include<bitset>
#define MAX_N 1000005
#define MOD 9973
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
int T, N;
bitset < MAX_N > ciur;
int divi[MAX_N],nr;
void MakeEratosthene ( void )
{
int i , ii ;
for( i = 2 ; i <= MAX_N ; ++i )
if( ciur[i] == false )
{
divi[++nr] = i ;
for( ii = i + i ; ii <= MAX_N ; ii+=i )
ciur[ii] = true ;
}
}
int lgput ( int a , int b )
{
int rez =1 ;
while ( b )
{
if( b % 2 == 1 )
rez = ( rez *a ) % MOD;
a = ( a*a) % MOD;
b = b /2;
}
return rez;
}
int main ( void )
{
int i , j;
MakeEratosthene();
in>>T;
for( ; T > 0 ; --T )
{
in>>N;
int nd = 1 , sd = 1 , p1 , p2 ;
for( i = 1 ; i <= nr && (long long) divi[i]*divi[i] <= N; ++i )
{
if( N % divi[i] )
continue ;
int p = 0 ;
while( N % divi[i] == 0 )
{
N /= divi[i];
++p;
}
nd *= ( p+1) ;
p1 = ( lgput( divi[i], p+1) -1 ) % MOD;
//inversul modular , MOD -nr prim => Fermat
p2 = ( lgput( divi[i] -1 , MOD-2) ) % MOD;
sd = ( ( sd * p1 ) % MOD *p2) % MOD ;
}
if( N > 1 )
{
nd *= 2;
sd = ( 1LL*sd*(N+1)%MOD);
}
out << nd <<" " << sd <<"\n";
}
in.close();
out.close();
return 0 ;
}