Cod sursa(job #1799187)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 5 noiembrie 2016 21:30:40
Problema Sum Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
# include <fstream>
# include <cstring>
# include <bitset>
using namespace std;
class InputReader {
    public:
        InputReader() {}
        InputReader(const char *file_name) {
            input_file = fopen(file_name, "r");
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
        inline InputReader &operator >>(int &n) {
            while(buffer[cursor] < '0' || buffer[cursor] > '9') {
                advance();
            }
            n = 0;
            while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
                n = n * 10 + buffer[cursor] - '0';
                advance();
            }
            return *this;
        }
    private:
        FILE *input_file;
        static const int SIZE = 1 << 17;
        int cursor;
        char buffer[SIZE];
        inline void advance() {
            ++ cursor;
            if(cursor == SIZE) {
                cursor = 0;
                fread(buffer, SIZE, 1, input_file);
            }
        }
};
bitset<500> f;
int d[300],e[15],b[15],n,x,y,i,j,r,k,t,p,nr;
long long sol;
int main () {
    InputReader fin("sum.in");
    freopen("sum.out","w",stdout);
    for(i=2;i<=490;i++)
        if(!f[i]){
            d[++k]=i;
            for(j=2*i;j<=490;j+=i)
                f[j]=1;
        }
    fin>>n;
    for(r=1;r<=n;r++){
        sol=0;
        t=0;
        memset(b,0,sizeof(b));
        fin>>x;
        y=x;
        for(i=1;i<=k;i++){
            if(y%d[i]==0)
                e[++t]=d[i];
            while(y%d[i]==0)
                y/=d[i];
        }
        if(y>1)
            e[++t]=y;
        x*=2;
        while(!b[0]){
            j=t;
            while(b[j]==1)
                b[j--]=0;
            b[j]=1;
            p=1;
            nr=0;
            for(i=1;i<=t;i++){
                nr+=b[i];
                if(b[i])
                    p*=e[i];
            }
            if(nr%2==0)
                sol+=1LL*p*(x/p)*(x/p+1)/2;
            else
                sol-=1LL*p*(x/p)*(x/p+1)/2;
        }
        printf("%lld\n",sol);
    }
    return 0;
}