Cod sursa(job #2514700)

Utilizator Sho10Andrei Alexandru Sho10 Data 26 decembrie 2019 17:07:25
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h> //JuniorMonster a.k.a Sho10
#define ll long long int
#define int long
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define all(a) (a).begin(), (a).end()
#define sz size
#define f first
#define s second
#define pb push_back
#define er erase
#define in insert
#define mp make_pair
#define pi pair
#define rc(s) return cout<<s,0
#define endl '\n'
#define mod 1000000007
#define PI 3.14159265359
#define CODE_START  ios_base::sync_with_stdio();cin.tie();cout.tie();
using namespace std;
int n,u[1005],t,e=0,ans=0,sum=0,d=0,v[1000010],q=0,x,y;
bitset<2000010>m;
int putere(int,int);
int32_t main(){
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
CODE_START;
cin>>t;
int mx=0;
for(int i=t-1;i>=0;i--){
    cin>>u[i];
    mx=max(mx,u[i]);
}
m[2]=0;
v[0]=2;
q=1;
for(int i=3;i<=sqrt(mx);i=i+2){
    if(m[i]==0){
        v[q]=i;
        q++;
        m[i*2]=1;
        for(int j=i+i+i;j<=sqrt(mx);j=j+i){
            m[j]=1;
        }
    }
}
while(t--){
        n=u[t-1];
        sum=1;
ans=1;
for(int i=0;n!=1&&v[i]*v[i]<=n;i++){
        if(n%v[i]==0){
            d=v[i];
            e=1;
            while(n%d==0){
                e++;
                n=n/d;
            }
        ans=ans*e;
        x=putere(d,e);
        x--;
        if(x<0) x=x+int(9973);
                y=putere((d+9972)%int(9973),9971);
                x=x*y%int(9973);
                sum=sum*x%int(9973);
}
}
if(n!=1){
    d=n%int(9973);
    e=2;
    ans=ans*e;
        x=putere(d,e);
        x--;
        if(x<0) x=x+int(9973);
                 y=putere((d+9972)%int(9973),9971);
                x=x*y%int(9973);
                sum=sum*x%int(9973);
}
cout<<ans<<' '<<sum<<'\n';
}
}

int putere(int a,int b) {
	if (b==0)
		return 1;
	if (b==1)
		return a%int(9973);
	else {
		int c=putere(a,b/2);
		c=c*c;
		if (b%2==0)
			return c%int(9973);
		else
			return ((a%int(9973))*(c%int(9973)))%int(9973);
	}
}