Cod sursa(job #548801)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 7 martie 2011 20:24:24
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
# include <fstream>
# include <bitset>
# define mod 9973
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
long long int n;
int a[1000000],q,w,sd,pd,k,i,p,t,j,m=1000005;
bitset <1000010> v;
  
  void ciur ()
  {
	  long long int i,j;
	  for (i=2;i<=m;i+=2)
		  v[i]=1;
	  k++;
	  a[k]=2;
	  
	  for (i=3;i<=m/2;i=i+2)
		  if (v[i]==0)
		  {
			  k++;
			  a[k]=i;
			  for (j=i*i;j<=m;j=j+2*i)
				  v[j]=1;
		  }
  }
  
  inline int putere (int a,int b)
  {
	  if (b==1)
		  return a%mod;
	  else
		  if (b%2==0)
			  return (int) (putere (a,b/2)*putere (a,b/2))%mod;
		  else
			  return a*putere (a,b-1)%mod;
  }

int main ()
{
	ciur ();
	f>>t;
	
	for (;t>=1;t--)
	{
		f>>n;
		sd=1;
		pd=1;
		for (j=1;j<=k && a[j]*a[j]<=n;j++)
		{
			i=a[j];
			p=0;
			if (n%i==0)
			{	while (n%i==0)
				{
					n=n/i;
					p++;
				}
				
			sd=sd*(p+1);
			
			q=(putere (i%mod,p+1)%mod)-1;
			w=(putere ((i-1)%mod,mod-2))%mod;
			
			pd=(pd*((q*w)%mod))%mod;
		
			}
		}
		if (n!=1)
		{
			p=1;
			i=n;
		    sd=sd*(p+1);
			
			q=(putere (i%mod,p+1)%mod)-1;
			w=(putere ((i-1)%mod,mod-2))%mod;
			
			pd=(pd*((q*w)%mod))%mod;
		}
		
		g<<sd<<" "<<pd<<"\n";
	}
	
	return 0;
}