Cod sursa(job #2157907)

Utilizator shantih1Alex S Hill shantih1 Data 9 martie 2018 23:47:31
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#define crmx 1000000
#define mod 9973

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

int n,i,j,t,np,dv[80000],NR,SUM,MARE,x,y,h;
bool b[1000010];

void invmod(int a,int b,int &x,int &y)
{
	if(b==0)
	{   x=1;  y=0;  }
	else
	{
		int x0,y0;
		invmod(b,a%b,x0,y0);
		x=y0;
		y=x0-(a/b)*y0;
	}
}
int rlp(int a,int b)
{
	int r=1;
	while(b)
	{
		if(b%2==0)
		{	b/=2;	a=(a*a)%mod;	}
		else
		{	b--;	r=(r*a)%mod;	}
	}
	return r;
}
int main (){
 	
	for(i=2;i<=crmx;i++)
		if(b[i]==0)
		{
			np++;   dv[np]=i;
			for(j=2;j*i<=crmx;j++)	b[i*j]=1;
		}

	fin>>t;
	while(t)
	{
		fin>>n;
		NR=1;
		MARE=1;
		int d=1;
		int pt=0;
		while(n!=1&&d<=np)
		{
			pt=0;
			while(n%dv[d]==0)
			{   pt++;   n/=dv[d];   }
			if(pt!=0)
			{
				NR*=pt+1;
				NR%=mod;
				
				SUM=rlp(dv[d],pt+1);
				SUM=(SUM+mod-1)%mod;
				
				invmod(dv[d]-1,mod,x,y);
				if(x<0)  x=(x%mod)+mod;
				SUM=(SUM*x)%mod;
				MARE=(MARE*SUM)%mod;
			}
			d++;
		}
		if(n>1)
		{
			NR=(NR*2)%mod;
			SUM=(n*n+mod-1)%mod;
			invmod(n-1,mod,x,y);
			if(x<0)  x=(x%mod)+mod;
			SUM=(SUM*x)%mod;
			MARE=(MARE*SUM)%mod;
		}
		
		fout<<NR<<" "<<MARE<<"\n";
		t--;
	}
}