Cod sursa(job #805316)

Utilizator enedumitruene dumitru enedumitru Data 31 octombrie 2012 09:30:25
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<fstream>
#define LL unsigned long long
#define M 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
LL a, b, sumdiv, p[50], d[50];
inline LL put(LL n, LL p)
{	LL val = 1;
    for(LL i = p; i; i>>=1)
    {   if(i & 1) val = (val * n) % M;
        n = (n * n) % M;
    }
    return val;
}
int main()
{   f>>a>>b;
	if(a==0) sumdiv=0;
		else
			{	LL i = 2,k=0;
				while(i * i <= a)
					{if(a % i == 0)
						{	p[++k] = i; d[k] = 0;
							while(a % i == 0){d[k]++; a /= i;}
							d[k] *= b;
						}
					++i;
					}
				if(a > 1) {p[++k] = a; d[k] = b;}
				sumdiv = 1;
				for(i = 1; i <= k; ++i)
					if(p[i] % M == 1) sumdiv = (sumdiv * ((d[i] + 1) % M)) % M;
					else
					{	LL val = put(p[i], d[i] + 1) - 1;
						LL inv = put(p[i] - 1, 9899);
						sumdiv = (sumdiv * val * inv) % M;
					}
			}
    g<<sumdiv<<'\n'; 
	g.close(); return 0;
}