Cod sursa(job #2647498)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 4 septembrie 2020 22:49:29
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

int MOD=9973;
bool ciur[1000001];
int prime[1000001],k=0;

long long lgput(long long number,long long power)
{
	long long ans=1;
	while(power)
	{
		if(power%2!=0)
		{
			power--;
			ans=(ans*number)%MOD;
			ans%=MOD;
		}
		else
		{
			number=(number*number)%MOD;
			power/=2;
			number%=MOD;
		}
	}
	return ans;
}


int main()
{
	for(int i=2;i<1000005;i++)
	{
		if(ciur[i]==0)
		{
			for(int j=i+i;j<1000005;j+=i)
			{
				ciur[j]=1;
			}
			prime[++k]=i;
		}
	}

	int t;
	in>>t;
	while(t--)
	{
		long long n;
		in>>n;
		long long ans1=1,ans2=1;
		for(int i=1;i<=k&&1ll*prime[i]*prime[i]<=n;i++)
		{
			int	power=0;
			if(n%prime[i]==0)
			{
				int power=0;
				while(n%prime[i]==0)
				{
					power++;
					n/=prime[i];
				}
				ans1=ans1*(power+1);
				long long a=(lgput(prime[i],power+1)-1) % MOD;
				long long b=lgput(prime[i]-1,MOD-2) % MOD;
				ans2=(((ans2*a)%MOD)*b)%MOD;
			}
		}
		if(n>1)
		{
			ans1=(ans1*2)%MOD;
			ans2=(1ll*ans2*(n+1))%MOD;
		}
		out<<ans1<<" "<<ans2<<"\n";
	}
	return 0;
}