Cod sursa(job #2497360)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 22 noiembrie 2019 15:34:20
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <bitset>
#define R 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset <1000010> b;
long long n;
int t,i,j,sumdiv,nrdiv,x,y,p,prime[1000010],d,e;
int explog(int a,int p) {
	if(p==0)return 1;
	if(p==1)return a%R;
    int r=explog(a,p/2);
    r=r*r;
    if(p%2==0)return r%R;
    return ((a%R)*(r%R))%R;
}
int main() {
    prime[prime[0]=1]=2;
    for(i=3;i<=1000000;i+=2)
        if(!b[i]){
            prime[++prime[0]]=i;
            for(j=i+i;j<=1000000;j+=i)
                b[j]=1;
        }
    for(fin>>t;t--;){
        fin>>n;
        nrdiv=sumdiv=1;
        for(i=1;n!=1&&1LL*prime[i]*prime[i]<=n;i++){
            if (n%prime[i])continue;
            d=prime[i];
            e=1;
            while (n%d==0) {
                e++;
                n/=d;
            }
            nrdiv*=e;
            x=explog(d,e)-1;
            if (x<0)x+=R;
            y=explog(d+R-1,R-2);
            x=(x*y)%R;
            sumdiv=sumdiv*x%R;
        }
        if(n!=1){
            nrdiv*=2;
            n%=R;
            sumdiv=(sumdiv*(n+1))%R;
        }
        fout<<nrdiv<<" "<<sumdiv<<"\n";
    }
    return 0;
}