Cod sursa(job #602120)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 9 iulie 2011 03:35:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <fstream>
#include <bitset>

using namespace std;

#define m 9973
#define N 1000005

int p[N];
bitset<N> c;

inline int power (int a,int p){
	
	int r=1;
	a%=m;
	for(;p;p>>=1){
		if(p&1){
			r*=a;
			r%=m;
			}
		a*=a;
		a%=m;
		}
	
	return r;}

int main ()
{
	
	int n=0,t,nr,sum,pp,p1,p2;
	long long x;
	for(int i=2;i+1<N;++i)
		if(c[i]==0){
			p[++n]=i;
			for(int j=i+i;j+1<N;j+=i)
				p[j]=1;
			}
	ifstream f ("ssnd.in");
	freopen ("ssnd.out","w",stdout);
	for(f>>t;t;--t){
		f>>x;
		nr=1;
		sum=1;
		for(int i=1;i<=n&&1LL*p[i]*p[i]<=x;++i){
			if(x%p[i])
				continue;
			pp=0;
			while(x%p[i]==0){
				x/=p[i];
				++pp;
				}
			nr*=(pp+1);
			p1=(power(p[i],pp+1)-1)%m;
			p2=power(p[i]-1,m-2)%m;
			sum=(((sum*p1)%m)*p2)%m;
		}
		if(x>1){
			nr*=2;
			sum=(1LL*sum*(x+1)%m);
			}
		printf("%d %d\n",nr,sum);
	}
	
	return 0;}