Cod sursa(job #1113252)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 20 februarie 2014 15:00:23
Problema Zero 2 Scor 50
Compilator cpp Status done
Runda preoni2007_probleme_9-10_r2-3 Marime 1.45 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define x first
#define y second
#define LL long long

using namespace std;

vector< pair< int, int > > D;

void desc(int n){
    D.clear();
    if(n % 2 == 0){
        D.push_back(make_pair(2, 0));
        while(n % 2 == 0){
            ++D[0].y;
            n /= 2;
        }
    }
    for(int i = 3; i * i <= n && n != 1; i += 2)
        if(n % i == 0){
            D.push_back(make_pair(i, 0));
            int Size = D.size() - 1;
            while(n % i == 0){
                n /= i;
                ++D[Size].y;
            }
        }
    if(n > 1)
        D.push_back(make_pair(n, 1));
}

inline int solve(int n, int k){
    desc(k);///descompun baza
    int Ans = -1;
    for(vector< pair< int, int > >::iterator it = D.begin(); it != D.end(); ++it){
        LL Sol = 0, Number = (LL)it->x;
        while(Number <= n){
            LL c = (LL)n / Number;
            Sol += Number * c * (c - 1) / 2;
            Sol += (n - Number * c + 1) * c;
            Number *= it->x;
        }
        if(Ans == -1)
            Ans = Sol / it->y;
        else
            Ans = min(Ans, (int)Sol / (it->y));
    }
    return Ans;
}

int main(){
    freopen("zero2.in", "r", stdin);
    freopen("zero2.out", "w", stdout);
    for(int L = 1; L <= 10; ++L){
        int n, k;
        scanf("%d %d", &n, &k);
        printf("%d\n", solve(n, k));
    }
    return 0;
}