Pagini recente » Cod sursa (job #1894672) | Autentificare | Cod sursa (job #337639) | Cod sursa (job #983318) | Cod sursa (job #981579)
Cod sursa(job #981579)
#include<fstream>
#include<algorithm>
#include<utility>
#include<bitset>
#define MAX_N 1000005
#define MOD 9973
using namespace std;
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
long long N,B;
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 ;
a%=MOD;
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>>N>>B ;
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;
}
p *= B;
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 == 2 )
{
sd = 15 ;
}
else
if( N > 1)
{
sd=(sd*(lgput(N,B+1)-1)%MOD*lgput(N-1,MOD-2))%MOD;
}
out << sd <<"\n";
in.close();
out.close();
return 0 ;
}