Cod sursa(job #2337836)

Utilizator Leonard123Mirt Leonard Leonard123 Data 6 februarie 2019 19:01:52
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include<bitset>
#include<fstream>
using namespace std;

ifstream cin("ssnd.in");
ofstream cout("ssnd.out");
#define mod 9973
#define m 1000005
bitset <m> bitsett;
int v[m],k=1;

void ciur(){
    v[1]=2;
    for(int i=3; i<m; i+=2)
        if(bitsett[i]==0){
            v[++k]=i;
            for(int j=i+i; j<m; j+=2*i))
                bitsett[j]=1;
        }

}

int pow(int a, int b){
    int produs=1;
    a%=mod;
    for(;b; b>>=1){
        if(b&1)
            produs=(a*produs)%mod;
        a=(a*a)%mod;
    }
    return produs;
}

int main()
{
    ciur();
    long long suma=1, nr=1,n;
    int t, put=0,ok;
    cin>>t;
    while(t){
        ok=1;
        cin>>n;
        if(n<m && n%2==1 && n!=1)
            if(bitsett[n]==0){
                cout<<2<<' '<<n+1;
                ok=0;
            }
        if(ok){
        for(int i=1; i<=k && 1ll*v[i]*v[i]<=n; i++){
            if(n%v[i]) continue;
            while(n%v[i]==0){
                n/=v[i];
                put++;
            }
            int p1 = (pow(v[i], put+1) - 1) % mod;
            int p2 = pow(v[i]-1, mod-2) % mod;
            suma=(((suma*p1)%mod)*p2)%mod;
            nr*=put+1;
            put=0;
        }
        if(n>1){
            nr*=2;
            suma=(suma*(n+1))%mod;
        }
        cout<<nr<<' '<<suma<<'\n';
        nr=1;
        suma=1;
        }
        t--;
    }
    return 0;
}