Cod sursa(job #687220)

Utilizator Robert29FMI Tilica Robert Robert29 Data 22 februarie 2012 10:46:17
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<bitset>
#define mod 9973
#define ll long long
using namespace std;
FILE*f=fopen("ssnd.in","r");
FILE*g=fopen("ssnd.out","w");
long long n,V[80000];
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;
	V[1]=4;
	for(register int i=3;i<=1000000;i+=2)
		if(!c[i])
		{
			v[++nr]=i;
			V[nr]=1ll *v[nr]*v[nr];
			for(register int j=i+i;j<=1000000;j+=i)
				c[j]=1;
		}
	fscanf(f,"%d",&t);
	int X,Y,p,s;
	long long N;
	for(register int o=1;o<=t;++o)
	{
		fscanf(f,"%lld",&n);
		N=n;
		p=1;
		s=1;
		for(register int i=1;V[i]<=N&&n>1;++i)
		{
			if(n%v[i]==0)
			{
				X=0;
				Y=v[i];
				while(n%v[i]==0)
				{
					X++;
					n/=v[i];
				}
				p*=(X+1);
				s=(s*(put(Y,X+1)-1)%mod*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;
}