Cod sursa(job #2381683)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 17 martie 2019 12:24:00
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define MAX 1000010
#define MOD 9973
#define ll long long 
using namespace std;

bool E[MAX];
int n;
ll ne=1,se=1,l=0,b,c,x,y,V[MAX];
//Suma si numarul divizorilor

ll inv(ll a,ll b,ll &x,ll &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	ll x0,y0,s;
	s=inv(b,a%b,x0,y0);
	x=y0;
	y=x0-a/b*y0;
	return s;
}

ll fast_exp(ll a,ll b){
	if(b==1)return a%MOD;
	ll c=fast_exp(a,b/2)%MOD;
	c*=c;
	c%=MOD;
	if(b%2)c*=a%MOD;
	return c%MOD;
}

int main(){
	ifstream cin("ssnd.in");
	ofstream cout("ssnd.out");
	for(int i=2;i<=MAX;i++){
		if(!E[i]){
			V[l++]=i;
			for(ll j=i*i;j<=MAX && j>0;j++){
				E[i]=1;
			}
		}
	} 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>c;
		b=c;
		int j=0;
		while(b>1 && j<l){
			if(b%V[j]==0){
				//V[j]
				int counter=1;
				ll prod=V[j];
				while(b%V[j]==0){
					b/=V[j];
					counter++;
				}
				ll e=fast_exp(V[j],counter)-1;
				ne*=counter;
				inv(V[j]-1,MOD,x,y);
				while(x<0)x+=MOD;
				se*=e%MOD*x;
				se%=MOD;
			}
			if(V[j]>sqrt(c) && b>1){
				//b
				inv(b-1,MOD,x,y);
				while(x<0)x+=MOD;
				ll e=fast_exp(b,2)-1;
				se*=e%MOD*x;
				se%=MOD;
				ne*=2;
				b=1;
			}
			j++;
		}
		cout<<ne<<' '<<se<<'\n';
		ne=se=1;
	}
	return 0;
}