Cod sursa(job #2578556)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 11 martie 2020 11:36:28
Problema Descompuneri Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
ll n,k,dp[4095][4095];
vector<pair <ll ,ll> > divizori[4095];
vector<ll> diviz;


void perechidiv(int i)
{
    int l=1,r=i;
    ll val=diviz[i];


    while(l<=r)
    {
        if(1LL*diviz[l]*diviz[r]==val) {divizori[i].push_back({l,r});l++;r--;}
        else
        {
            if(1LL*diviz[l]*diviz[r]>val) r--;
            else l++;
        }
    }
    divizori[i].push_back({i,0});


}
int main()
{
f>>n>>k;
for(int i=1;1LL*i*i<=n;i++)
{
    if(n%i==0)
    {
        if(n/i!=i)
        {
            diviz.push_back(i);
            diviz.push_back(n/i);
        }
        else
            diviz.push_back(i);
    }
}

sort(diviz.begin(),diviz.end());
int z=diviz.size();
for(int i=0;i<z;i++)
{
    perechidiv(i);
    dp[i][i]=1;

}
dp[0][0]=1;
//int z=diviz.size();
for(int i=1;i<z;i++)
{ll sol=0;
//cout<<diviz[i]<<" ";
int m=divizori[i].size();
    for(int j=0;j<m;j++)
    {///calculcam dp[i][x];

            ll val=divizori[i][j].second;
            int x=divizori[i][j].first;
            int cnt=divizori[val].size();
            if(val!=0){
            for(int d=cnt-1;d>=0;d--)
            {
                if(divizori[val][d].first>=x)
                {
                    dp[i][x]+=dp[val][divizori[val][d].first];
                }
            }
            }

         sol+=dp[i][x];


    }
    if(i==z-1){
  g<<sol<<'\n';
  g<<0;
  return 0;
    }
}
g<<0;

}