Cod sursa(job #769878)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 21 iulie 2012 11:22:27
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<iostream>
#include<fstream>
#include<bitset>
using namespace std;
#define mod 9901
#define stop 7100
bitset <stop+1> viz;
int p[stop];
void ciur()
{
	int i,j,k=0;
	for(i=2;i<=stop;i++)
		if(viz[i]==0) {
			p[++k]=i;
			for(j=i+i;j<=stop;j=j+i)
				viz[j]=1;
		}
}
int putere(int x, int p)
{
	int aux;
	if(p==1)
		return x;
	else if(p%2==1)
		return (1LL*(x%mod)*(putere(x,p-1)%mod))%mod;
	else {
		aux=putere(x,p/2)%mod;
		return (1LL*aux*aux)%mod;
	}
}

void gcd(long long &x, long long &y, int a, int b)  {  
	if (b==0) { 
		x=1;
		y=0;
	}		 
	else {             
		gcd(x,y,b,a%b);
		long long aux=x;
		x=y;
		y=aux-y*(a/b);
	}
}
int main ()
{
	int i,a,b,d,s,aux;
	long long inv,ins;
	ifstream f("sumdiv.in");
	ofstream g("sumdiv.out");
	f>>a>>b;
	f.close();
	s=1;
	ciur();
	for(i=1;i<=stop && p[i]*p[i]<=a;i++) 
		if(a%p[i]==0) {
			d=0;
			while(a%p[i]==0) {
				a=a/p[i];
				d++;
			}
			aux=putere(p[i],d*b+1);
			aux=(aux%mod-1+mod)%mod;
			gcd(inv,ins,p[i]-1,mod);
			if(inv<=0)
				inv=mod+inv%mod;
			aux=(aux*(inv%mod))%mod;
			s=(s%mod*aux%mod)%mod;
		}
	if(a>1) {
		if(a%mod!=1) {
			aux=putere(a,b+1);
			aux=(aux%mod-1+mod)%mod;
			gcd(inv,ins,a-1,mod);
			if(inv<=0)
				inv=mod+inv%mod;
			aux=(aux*(inv%mod))%mod;
			s=(s*aux)%mod;
		}
		else s=(s%mod*(b+1)%mod)%mod;
	}
	g<<s%mod;
	g.close();
	return 0;
}