Cod sursa(job #1113257)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 20 februarie 2014 15:01:15
Problema Zero 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>
#include <vector>

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

using namespace std;

vector< pair< LL, LL > > D;

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

inline LL solve(LL n, LL k){
    desc(k);///descompun baza
    LL Ans = -1;
    for(vector< pair< LL, LL > >::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, (LL)Sol / (it->y));
    }
    return Ans;
}

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