Cod sursa(job #687748)

Utilizator Robert29FMI Tilica Robert Robert29 Data 22 februarie 2012 18:56:09
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#include<math.h>
int rad(long long nr)
{
	return sqrt(nr);
}
#include<bitset>
#define ll long long
#define mod 9973
using namespace std;
FILE*f=fopen("ssnd.in","r");
FILE*g=fopen("ssnd.out","w");
long long n;
int nr,v[80000],t;
bitset <1000001> c;
struct div
{
	int e;
	long long p;
} w[50001];
int put(long long x,int e)
{
	int p=1;
	while(e)
	{
		if(e%2)
			p=(p%mod)*(x%mod)%mod;
		x=(x%mod)*(x%mod)%mod;
		e/=2;
	}
	return p;
}
int main()
{
	v[++nr]=2;
	
	for(register int i=3;i<=1000000;i+=2)
		if(!c[i])
		{
			v[++nr]=i;
			for(register int j=i+i;j<=1000000;j+=i)
				c[j]=1;
		}
	fscanf(f,"%d",&t);
	int X,Y,p,s;
	int N;
	for(register int o=1;o<=t;++o)
	{
		fscanf(f,"%lld",&n);
		N=rad(n);
		p=1;
		s=1;
		for(register int i=1;v[i]*v[i]<=n;++i)
		{
			if(n%v[i]==0)
			{
				X=0;
				Y=v[i];
				while(n%v[i]==0)
				{
					X++;
					n/=v[i];
				}
				p*=(X+1);
				s=(1ll *s*(put(Y,X+1)-1)*put(Y-1,mod-2))%mod;
			}
		}
		if(n>1)
		{
			int X=1;
			p*=2;
			int Y=n;
			s=(s*(put(Y,X+1)-1)%mod*put(Y-1,mod-2))%mod;
		}
	
		fprintf(g,"%d ",p);
		fprintf(g,"%d\n",s);
		
	}
	
	
	
	fclose(g);
	fclose(f);
	return 0;
}