Pagini recente » Cod sursa (job #2756905) | Cod sursa (job #2459683) | Cod sursa (job #1345338) | Cod sursa (job #846256) | Cod sursa (job #826585)
Cod sursa(job #826585)
#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;
}