Advertisement
leanchec

sequencias.cpp

Oct 24th, 2023
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<int> dp[1000010];
  5.  
  6. int tam[1000010];
  7.  
  8. vector<int> solve(int num){
  9.     if(!dp[num].empty())return dp[num];
  10.     vector<int> resp;
  11.  
  12.     vector<int> divisores;
  13.  
  14.     int aux=num;
  15.  
  16.     for(int i=2; i*i<=aux; i++){
  17.         if(aux%i==0){
  18.             while(aux%i==0){
  19.                 if(i==2){
  20.                     if(aux%4==0){
  21.                         divisores.push_back(4);
  22.                         aux/=4;
  23.                     }
  24.                     else{
  25.                         divisores.push_back(2);
  26.                         aux/=2;
  27.                     }
  28.                 }
  29.                 else{
  30.                     divisores.push_back(i);
  31.                     aux/=i;
  32.                 }
  33.             }
  34.         }
  35.     }
  36.  
  37.     if(divisores.empty()){
  38.         vector<int> aux1=solve(num-1), aux2=solve(num-2);
  39.         if(2*tam[num-2]+aux2.size()<tam[num-1]+aux1.size()){
  40.             for(int i=1; i<=tam[num-2]; i++){
  41.                 resp.push_back(aux2.size()+tam[num-2]);
  42.             }
  43.             for(int i=1; i<=tam[num-2]; i++){
  44.                 resp.push_back(aux2.size()-tam[num-2]);
  45.             }
  46.  
  47.             for(auto x:aux2)
  48.                 resp.push_back(x-2*tam[num-2]);
  49.  
  50.             tam[num]=tam[num-2];
  51.  
  52.             return dp[num]=resp;
  53.         }
  54.         else if(2*tam[num-2]+aux2.size()==tam[num-1]+aux1.size()){
  55.             if(tam[num-2]<tam[num-1]){
  56.                 for(int i=1; i<=tam[num-2]; i++){
  57.                     resp.push_back(aux2.size()+tam[num-2]);
  58.                 }
  59.                 for(int i=1; i<=tam[num-2]; i++){
  60.                     resp.push_back(aux2.size()-tam[num-2]);
  61.                 }
  62.  
  63.                 for(auto x:aux2)
  64.                     resp.push_back(x-2*tam[num-2]);
  65.  
  66.                 tam[num]=tam[num-2];
  67.  
  68.                 return dp[num]=resp;
  69.             }
  70.         }
  71.  
  72.         for(int i=1; i<=tam[num-1]; i++){
  73.             resp.push_back(aux1.size());
  74.         }
  75.  
  76.         for(auto x:aux1)
  77.             resp.push_back(x-tam[num-1]);
  78.  
  79.         tam[num]=tam[num-1];
  80.         return dp[num]=resp;
  81.     }
  82.  
  83.     if(aux!=1)divisores.push_back(aux);
  84.  
  85.     for(auto x:divisores){
  86.         vector<int> aux1=solve(x);
  87.         tam[num]+=tam[x];
  88.         for(auto y:aux1)
  89.             resp.push_back(y);
  90.     }
  91.  
  92.     return dp[num]=resp;
  93. }
  94.  
  95. int main(){
  96.     ios_base::sync_with_stdio(0); cin.tie(0);
  97.     int l;
  98.     cin >> l;
  99.  
  100.     dp[1]={0};
  101.     dp[2]={1, -1};
  102.     dp[3]={2, 0, -2};
  103.     dp[4]={3, 1, -1, -3};
  104.     dp[5]={4, 2, 0, -2, -4};
  105.     dp[6]={1, -1, 2, 0, -2};
  106.     dp[7]={6, 4, 2, 0, -2, -4, -6};
  107.     dp[8]={1, -1, 3, 1, -1, -3};
  108.     dp[46]={11, 11, 11, -1, -3, -5, -1, -3, -5, 1, -1, -3, -5, -7};
  109.     tam[1]=tam[2]=tam[3]=tam[4]=tam[5]=1;
  110.     tam[6]=2;
  111.     tam[7]=1;
  112.     tam[8]=2;
  113.     tam[46]=3;
  114.  
  115.     vector<int> resp=solve(l);
  116.  
  117.     cout << resp.size() << '\n';
  118.  
  119.     for(int i=1; i<=resp.size(); i++){
  120.         cout << i+resp[i-1] << " ";
  121.     }
  122.     cout << '\n';
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement