Cod sursa(job #2495190)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 18 noiembrie 2019 22:41:25
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <bitset>
#define mod 9973
using namespace std;

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

long long n,r;
int t,i,j,p[100000],m,sum,nr,cnt,x;
bitset <1000001> f;

int pow(long long a, int b){
    r=1;

    while(b){
        if(b&1)
            r=(r*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }

    return r;
}

int main(){
    p[++m]=2;
    for(i=3;i<1000000;i+=2){
        if(!f[i]){
            p[++m]=i;

            for(j=3*i;j<=1000000;j+=2*i)
                f[j]=1;
        }
    }

    for(fin>>t;t;t--){
        fin>>n;

        sum=1; nr=1;

        for(i=1;p[i]<=n/p[i] && i<=m;i++){
            if(n%p[i]==0){
                cnt=0;

                while(n%p[i]==0){
                    cnt++;
                    n/=p[i];
                }

                nr=(nr*(cnt+1))%mod;

                x=pow(p[i],cnt+1)-1;
                if(x<0)
                    x+=mod;
                sum=(sum*x)%mod;
                //sum=(sum* ( (pow(p[i],cnt+1)-1<0) ? pow(p[i],cnt+1)-1+mod : pow(p[i],cnt+1)-1 ) )%mod;
                sum=(sum*pow((p[i]-1+mod)%mod,mod-2))%mod;
            }
        }

        if(n!=1){
            nr*=2;

            x=pow(n,2)-1;
            if(x<0)
                x+=mod;
            sum=(sum*x)%mod;
            //sum=(sum* ( (pow(n,2)-1<0) ? pow(n,2)-1+mod : pow(n,2)-1 ) )%mod;
            sum=(sum*pow((n-1+mod)%mod,mod-2))%mod;
        }

        fout<<nr<<" "<<sum<<"\n";
    }

    return 0;
}