Cod sursa(job #826585)

Utilizator vendettaSalajan Razvan vendetta Data 30 noiembrie 2012 21:26:47
Problema Descompuneri Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>

using namespace std;

#define nmax 100005
#define sqrtN 320005
#define MOD 7001
#define ll long long

ifstream f("desc.in");
ofstream g("desc.out");

ll n, K;
ll dp[nmax];
vector<ll> v;
vector< pair<ll,ll> > lista[MOD+2];
set<ll> S;


void citeste(){

    f >> n >> K;

}

void baga(ll X, int poz){

    int rest = X % MOD;
    lista[rest].push_back( make_pair(X, poz) );

}

int afla(ll X){

    int rest = X % MOD;
    for(int i=0; i<lista[rest].size(); ++i){
        if (lista[rest][i].first == X){
            return (lista[rest][i].second);
        }
    }

    return -1;

}

void rezolva(){

  int sqrtn = sqrt(n);
    for(int i=1; i<=sqrtn; ++i){
        if (n % i != 0) continue;
        S.insert( i );
        S.insert( n/i );
    }
    //v.push_back(-1);
    for(set<ll>::iterator it=S.begin(); it!=S.end(); it++){
        v.push_back(*it);
    }
    for(int i=0; i<v.size(); ++i){
        baga( v[i], i );
    }

    //dp[i][j] numarul de moduri de a obtine al j- lea divizor daca ma folosesc si de al i-lea divizor

    dp[0] = 1;

    for(int i=1; i<v.size(); ++i){
        //for(int j=0; j<v.size(); ++j) dp[i][j] = dp[i-1][j];//, cout << dp[i][j] << " ";
        for(int j=0; j<v.size(); ++j){
            if ( v[j] % v[i] != 0) continue;
            int poz = afla(v[j]/v[i]);
            //cout << v[i] << " " << v[j] << " " << v[j]/v[i] << " " << poz << " " << dp[i][poz]<< " " << dp[i][j]<< "\n";
            if (poz == -1) continue;
            dp[j] += dp[ poz ];
            //cout << dp[i][j] << " ";
        }
        //cout << "\n";
    }

    cout<< dp[v.size()-1] << "\n";
    g << dp[v.size()-1] << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}