Cod sursa(job #416661)

Utilizator MciprianMMciprianM MciprianM Data 13 martie 2010 10:30:09
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
using namespace std;
ofstream g("ssnd.out");
const long long mod=9973, maxn=1000009;
long long s, nr;
long long pou(long long a, long long b){
	long long f=1;
	a=a%mod;
	while(b){
		if((b&1)){
			f*=a;
			f=f%mod;
		}
		a=a*a;a=a%mod;b=b>>1;
	}
	return f;
}
long long inv(long long x){
	long long m=mod-2, p=1;
	p=pou(x, m);
	return p;
}
void dec(long long x){
	long long d, e, ax;
	s=nr=1;
	for(d=2;d*d<=x;d++){
		e=0;
		if(x%d==0){
			while(x%d==0){
				e++;
				x/=d;
			}
		}
		if(e){
			nr=nr*(e+1);
			nr=nr%mod;
			ax=pou(d,e+1)-1;
			if(ax<0)	ax+=mod;
			if(ax>=mod)	ax-=mod;
			s=s*ax;
			s=s%mod;
			s=s*inv(d-1);
			s=s%mod;
		}
	}
	if(x!=1){
		nr=(nr<<1);
		nr=nr%mod;
		ax=pou(x, 2)-1;
		if(ax<0)	ax+=mod;
		if(ax>=mod)	ax-=mod;
		s=s*ax;
		s=s%mod;
		s=s*inv(x-1);
		s=s%mod;
	}
	g<<nr<<' '<<s<<'\n';
}
int main(){
	long long i, t, x;
	ifstream f("ssnd.in");
	f>>t;
	for(i=0;i<t;i++){
		f>>x;
		dec(x);
	}
	f.close();
	g.close();
	return 0;
}