Cod sursa(job #931140)

Utilizator gabriel.badeaGabriel Badea gabriel.badea Data 28 martie 2013 00:05:21
Problema Suma divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <bitset>

using namespace std;

const long long MOD = 9901;

long long N, M;
long long T, K;

ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

long long pow(long long x, long long p)
{
	long long rez = 1;
	x %= MOD;

	for(;p;p>>=1)
	{
		if(p&1)
		{
			rez *= x;
			rez %= MOD;
		}

		x *= x;
		x %= MOD;
	}
	return rez;
}

void sol()
{
	f >> N;
	f >> M;

	long long sd = 1, p = 0;

	for(long long i = 2; i * i <= N && N > 1; ++i)
	{
		if(N % i) continue;
		p = 0;

		while(N % i == 0)
		{
			N /= i;
			++p;
		}
		
		if(i % MOD == 1)
			sd *= 1LL * (p + 1) % MOD;
		else
		{
			long long p1 = ( pow ( i, p * M + 1 ) + MOD - 1 ) % MOD;
            long long p2 = pow( i - 1, MOD - 2 ) % MOD;

			sd *= 1LL * p1 * p2;
			sd *= MOD;
		}
	}

	 if ( M > 1 ){
 
        if ( N % MOD == 1 )
            sd = ( sd * 1LL * ( M % MOD + 1 ) ) % MOD;
        else{
                long long p1 = ( pow ( N, M + 1) + MOD - 1 ) % MOD;
                long long p2 = pow ( N - 1, MOD - 2 ) % MOD;
 
                sd *= 1LL * p1 * p2;
                sd %= MOD;
        }
    }
 
     if ( N == 0 )
        g << 0 << "\n";
     else
        g << sd << "\n";
}

int main()
{
	sol();
}