Cod sursa(job #1381156)

Utilizator sddsdssasDarius Emanuel sddsdssas Data 8 martie 2015 11:41:58
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <bitset>
#include <vector>
#define vpb qq.push_back
#define N 1000000
#define FOR(i, a, b, step)  for ( i = (a); i <= (b); i+=step)
#define LL long long
#define MOD 9973
using namespace std;
bitset<N> prim;
vector <int> qq;
void gjqgwgqw(){
    int i,j;
    vpb(2);
    FOR(i,3,N,2) prim[i]=1;
    FOR (i,3,N,2){
        if (prim[i]){
                vpb(i);
            FOR (j,(i<<1)+i,N,i<<1){
                prim[j]=0;}
        }
    }
}
int lgput(int a, int b){
    LL sol = 1;
    while (b>0){
            if (b&1) {
                    sol = (sol*a)%MOD;
            b--;}
            a=(a*a)%MOD;
            b>>=1;}
            return sol;
}


void stopcheatpls (){
    int x;
    scanf ("%d", &x);
    int nr = 1 , sum = 1 ,pp;
    int fx, fq,i;
    FOR (i,0,N&&1LL*qq[i]*qq[i]<=x,1){
        if (x%qq[i]) continue;
        pp = 0 ;
        while (x%qq[i]==0){
                pp++;
        x/=qq[i];}
        nr=nr*(pp+1);
        fx = lgput(qq[i],pp+1)-1;
        fq= qq[i] - 1;
        sum*=(fx/fq);}
 if (x > 1 && 1LL* qq[i] *qq[i] >x){ nr*=2;
 sum*=(x+1);
 }
printf ("%d %d\n", nr, sum);}
int main()
{
   freopen ("ssnd.in", "r", stdin);
   freopen ("ssnd.out", "w", stdout);
   int t;
   scanf ("%d", &t);int i;
   ciuruiala();
   while (t--) stopcheatpls();

}