Cod sursa(job #1500114)

Utilizator Balescu_OvidiuBalescu Ovidiu-Gheorghe Balescu_Ovidiu Data 11 octombrie 2015 15:41:29
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
using namespace std;

unsigned long long pow(unsigned long long n, unsigned long long p){
    unsigned long long x=1;
    while(p){
        if(p&1){
            x*=n;
            p--;
        }
        n*=n;
        p>>=1;
    }
    return x;
}
unsigned long divizor(unsigned long long n, unsigned long div){
	unsigned long q=0;
	while(n%div==0){
		n/=div;
		q++;
	}
	return q;
}
bool c[1000001];
int main(){
	c[0]=c[1]=1;
	for(unsigned long i=2;i<=1000000;i+=2)
		c[i]=1;
	for(unsigned long i=3;i<=1000001;i+=2)
		if(!c[i])
			for(unsigned long j=3;i*j<=1000001;j+=2)
				c[i*j]=1;
	unsigned t; unsigned long long n;
    ifstream f("ssnd.in");
    f>>t;
    ofstream g("ssnd.out");
    while(t--){
        f>>n;
		if(n<=1000001)
			if(!c[n])
				g<<2<<' '<<(n+1)%9973<<'\n';
		else{
			unsigned long long q,Q=1,suma=1;
			if(n%2==0){
				q=divizor(n,2);
				Q*=q+1;
				suma*=pow(2,q+1)-1;
			}
			for(unsigned long div=3;div*div<=n&&n>1;div+=2){
				if(!c[div]&&n%div==0){
					q=divizor(n,div);
					Q*=q+1;
					suma*=(pow(div,q+1)-1)/(div-1);
				}
			}
			g<<Q<<' '<<suma%9973<<'\n';
		}
    }
    f.close();
    g.close();
    return 0;
}