Pagini recente » Cod sursa (job #464510) | Cod sursa (job #2962915) | Cod sursa (job #661402) | Cod sursa (job #167793) | Cod sursa (job #826562)
Cod sursa(job #826562)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
#define nmax 1005
#define ll long long
#define MOD 7001
ll n, K;
ll dp[nmax][nmax];
vector<ll> v;
vector< pair<int,int> > lista[MOD+4];
set<ll> S;
void citeste(){
f >> n >> K;
}
void baga(int X, int poz){
int rest = X % MOD;
lista[rest].push_back( make_pair(X, poz) );
}
int afla(int 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;
}
}
}
void rezolva(){
//aflu divizorii lui n si apoi vreau sa vad in cate moduri il pot obtine pe n
// fac un dp[i][j] = nr de moduri de a obtine al i-lea divizor folosindu-ma de divizorii j, j+1,..,n;
ll sqrtn = sqrt(n);
for(ll i=1LL; 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 );
}
n = v.size()-1;
for(int i=1; i<=n; ++i) dp[1][i] = 1;
for(int i=2; i<=n; ++i){
//cout << i << ": ";
for(int j=n; j>=1; --j){
dp[i][j] += dp[i][j+1];
if ( v[i] % v[j] != 0 ) continue;
int X = v[i] / v[j];
int poz = afla( X );
//cout << poz << " " << v[i] << " " << v[j] << " " << j << "\n";
//poz++;
dp[i][j] += dp[poz][j];
//cout << dp[i][j] << " ";
}
//cout << '\n';
}
g << dp[n][2];
cout << dp[n][2];
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}