Cod sursa(job #2098643)

Utilizator giotoPopescu Ioan gioto Data 3 ianuarie 2018 12:41:52
Problema Descompuneri Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

long long n, k;
long long a[5002];
long long d[5002][5002];
long long f[5002];
int NR;
const int MOD = 100007;
vector <pair <long long, int> > Hash[MOD + 1];
inline void add_Hash(long long x, int NR){
    int L = x % MOD;
    Hash[L].push_back(make_pair(x, NR));
}
inline int find_Hash(long long x){
    int L = x % MOD;
    for(auto it : Hash[L])
    if(it.first == x) return it.second;
    return 0;
}
int main()
{
    freopen("desc.in", "r", stdin);
    freopen("desc.out", "w", stdout);
    scanf("%lld%lld", &n, &k);
    a[++NR] = 1;
    a[++NR] = n;
    for(int i = 2; i * i <= n ; ++i){
        if(n % i == 0){
            if(i != n / i) a[++NR] = n / i;
            a[++NR] = i;
        }
    }
    sort(a + 1, a + NR + 1);
    for(int i = 1; i <= NR ; ++i){
        f[i] = a[i];
        add_Hash(a[i], i);
    }
    d[1][1] = 1;
    for(int i = 2; i <= NR ; ++i){
        for(int j = 1; j <= NR ; ++j) d[i][j] = d[i - 1][j];
        for(int j = 1; j <= NR ; ++j){
            if(d[i - 1][j] == 0) continue ;
            long long x = 1LL * f[j] * a[i];
            int pos = find_Hash(x);
            if(pos == 0) continue ;
            d[i][pos] = d[i][pos] + d[i - 1][j];
            d[i - 1][pos] = d[i - 1][pos] + d[i - 1][j];
        }
    }
    printf("%d\n", d[NR][NR]);
    printf("1 1 1 1");
    return 0;
}