Cod sursa(job #582531)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 15 aprilie 2011 15:00:35
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
#define MOD 9901
#define pb push_back
#define NM 50000001
bitset<NM> viz;
vector<int > prim;
int N,M;
inline void ciur()
{
	int d=2;
	
	viz.reset();
	while (d*d<=N)
	{
		if (viz[d])
		{
			++d;
			continue;
		}
		prim.pb(d);
		for (int i=d*d; i<=N; i+=d)
			viz[i]=1;
		++d;
	}
	for (;d<=N; ++d)
		if (!viz[d])
			prim.pb(d);
	
}
inline int mod(int a)
{
	if (a>=MOD)
		a%=MOD;
	return a;
}
inline int putere(int n,int p)
{
	if (!p)
		return 1;
	if (p&1)
	{
		n=mod(n);
		return n*putere(mod(n*n),p>>1);
	}
	return putere(mod(n*n),p>>1);
}
inline void desc()
{
	int g=prim.size();
	int suma=1,baza=1;
	for (int i=0; prim[i]*prim[i]<=N && i<g; ++i)
	{
		if (N%prim[i]!=0)
			continue;
		int p=0;
		while (N%prim[i]==0)
		{
			N/=prim[i];
			++p;
		}
		if (!p)
			continue;
		if (p==1)
			--p;
		int n=mod(prim[i]);
		baza=mod(putere(n,M+p+1));
		if (baza-1<0)
			baza=MOD-baza;
		n=mod(prim[i]);
		suma=mod((baza-1)/(n-1)*suma);
			
	}
	if (N-1)
	{
		int n=mod(N);
		 baza=mod(putere(n,M+1));
		if (baza-1<0)
			baza=MOD-baza;
		n=mod(N);
		suma=mod((baza-1)/(n-1)*suma);
	}
	printf("%d ",suma);
}
inline void citire()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d%d",&N,&M);
	ciur();
	desc();
}
int main()
{
	citire();
	return 0;
}