Submission #1366541

#TimeUsernameProblemLanguageResultExecution timeMemory
1366541ASGA_RedSeaParrots (IOI11_parrots)C++20
98 / 100
32 ms908 KiB
/**

                                    * بسم الله الرحمن الرحيم *

                ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿

*/



/// author : "ASGA"


#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>


using namespace std;
using ll=long long;
using lll=__int128;


vector<vector<int>>f(100);


namespace encoder{
    lll C(lll n,lll k){
        lll r=1;
        map<int,int>v;

        for(int j=1;j<=n;j++)for(auto&i:f[j])v[i]++;
        for(int j=1;j<=k;j++)for(auto&i:f[j])v[i]--;
        for(int j=1;j<=n-k;j++)for(auto&i:f[j])v[i]--;
    
        for(auto&[i,j]:v){
            while(j>0){r*=lll(i);j--;}
        }
        return r;
    }
};

#include "encoder.h"
#include "encoderlib.h"


string S(lll n){
    string s;
    while(n){
        s+=n%10+'0';
        n/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}



void encode(int n, int a[]){
    {
        for(int i=2;i<100;i++){
            int ii=i;
            f[i].clear();
            for(int d=2;d<=ii;d++){
                while(ii%d==0){
                    ii/=d;
                    f[i].push_back(d);
                }
            }
        }
    }

    
    for(int i=0;i<n;i+=8){
        lll v=0;
        for(int j=0;j<8&&i+j<n;j++)v+=lll(a[i+j])<<lll(8*(7-j));
        
        lll c=40;
        for(int j=0;j<32;j++){
            if(c==0)break;

            lll tot=encoder::C(c-1+32-j-1,32-j-1);

            if(tot<=v)v-=tot;
            else{
                send(j|((i>>3)<<5));
                c--;j--;continue;
            }
        }
    }
}
/**

                                    * بسم الله الرحمن الرحيم *

                ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿

*/



/// author : "ASGA"


#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>


using namespace std;
using ll=long long;
using lll=__int128;


vector<vector<int>>ff(100);
namespace decoder{
	lll C(lll n,lll k){
		map<int,int>v;
		
		for(int j=1;j<=n;j++)for(auto&i:ff[j])v[i]++;
        for(int j=1;j<=k;j++)for(auto&i:ff[j])v[i]--;
        for(int j=1;j<=n-k;j++)for(auto&i:ff[j])v[i]--;
		
		lll r=1;
		for(auto&[i,j]:v){
			while(j>0){r*=lll(i);j--;}
		}
		return r;
	}
};

#include "decoder.h"
#include "decoderlib.h"




const lll VV=255;

void decode(int n,int l,int x[]){
	{
		for(int i=2;i<100;i++){
			ff[i].clear();
            int ii=i;
            for(int d=2;d<=ii;d++){
                while(ii%d==0){
                    ii/=d;
                    ff[i].push_back(d);
                }
            }
        }
    }

	vector<int>a(n,0);
    
    vector<int>f(300,0);
	for(int i=0;i<l;i++)f[x[i]]++;

	for(int i=0;i<n;i+=8){
		lll c=40,nn=0;
		for(int j=0;j<32;j++){
			c-=f[((i>>3)<<5)|j];
			if(c==0)break;
			nn+=decoder::C(c-1+32-j-1,32-j-1);
		}

		for(int j=0;j<8&&i+j<n;j++)a[i+j]=(nn>>lll(8*(7-j)))&VV;
	}

	for(int&i:a)output(i);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...