Cod sursa(job #434311)

Utilizator ooctavTuchila Octavian ooctav Data 5 aprilie 2010 16:54:35
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
const int MOD = 9901;
int A, B;

int pw(int a, int p)
{
	int rez = 1;
	a = a % MOD;
	for(; p ; p = p>>1)
	{
		if(p & 1)
			rez = (rez * a) % MOD , p--;
		a = (a * a) % MOD;
	}
	return rez;
}

void rezolva()
{
	long long n = A;
	int S = 1;
	for(int i = 2 ; i * i <= A ; i++)
		if(n % i == 0)
		{
			int exp = 0;
			while(n % i == 0)
			{
				n /= i;
				exp++;
			}
			S = ((S * pw(i, B * exp + 1) + MOD - 1) % MOD * pw(i - 1, MOD - 2)) % MOD;
		}
	if(n > 1)
		S = ((S * (pw(n, B + 1) + MOD - 1) % MOD) * pw(n - 1, MOD - 2)) % MOD;
		
	printf("%d", S);
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d%d",&A,&B);
	rezolva();
	
	return 0;
}
/*
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;

#define pb push_back
#define MOD 9901

long long n,m,sd;


long long lgput (long long n,long long p)
{
    long long rez;

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

    return rez;
}

void solve ()
{
    long long i,exp;

    sd=1;
    for (i=2; i*i<=n; ++i)
        if (n%i==0)
        {
            for (exp=0; n%i==0; n/=i)
                ++exp;
            if (i%MOD==1)
                sd=(sd*(exp*m+1))%MOD;
            else
                sd=((sd*(lgput (i,exp*m+1)+MOD-1)%MOD)*lgput (i-1,MOD-2))%MOD;
        }
    if(n>1)
    {
        if (n%MOD==1)
            sd=(sd*(m+1))%MOD;
        else
            sd=((sd*(lgput (n,m+1)+MOD-1)%MOD)*lgput (n-1,MOD-2))%MOD;
    }
    printf ("%lld",sd);
}

int main ()
{
    freopen ("sumdiv.in","r",stdin);
    freopen ("sumdiv.out","w",stdout);

    scanf ("%lld%lld",&n,&m);
    solve ();

    return 0;
}*/