제출 #1207630

#제출 시각아이디문제언어결과실행 시간메모리
1207630simona1230비스킷 담기 (IOI20_biscuits)C++20
0 / 100
1096 ms652 KiB
#include "biscuits.h"
#include <bits/stdc++.h>
using namespace std;


vector<long long> v;
long long p[128],h[64];
long long ans;

long long nd;
long long pw[128][128];
void dfs(int i,long long x)
{
    ans++;
    //cout<<i<<" ? "<<x<<endl;
    for(int j=i+1;j<=120;j++)
    {
        long long y=x;
        for(int k=i+1;k<=j;k++)
        {
            y/=2;
            y+=pw[k][k];
        }

        if(y>=nd)
        {
            //cout<<i<<" "<<x<<" "<<j<<" "<<y<<endl;
            dfs(j,y-nd);
        }
    }
    //cout<<i<<" ! "<<x<<endl;
}


long long count_tastiness(long long x, std::vector<long long> a)
{
    /*cout<<"in"<<endl;
    cout<<x<<endl;
    for(int i=0;i<a.size();i++)
        cout<<a[i]<<" ";
    cout<<endl;*/
    nd=x;
    ans=0;
    p[0]=1;
    for(long long i=1;i<=125;i++)
    {
        if(1e18/p[i-1]<2)p[i]=1e18+1;
        else p[i]=p[i-1]*2;
        //cout<<p[i]<<endl;
    }

    for(int j=0;j<=120;j++)
    {
        pw[j][j]=0;
        if(j<a.size())
        {
            pw[j][j]=a[j];
            //cout<<j<<" "<<j<<" "<<pw[j][j]<<endl;
        }
        for(int i=j-1;i>=0;i--)
        {
            pw[i][j]=pw[i+1][j];
            if(i<a.size())
            {
                pw[i][j]+=a[i]/p[j-i];
                //cout<<i<<" "<<j<<" "<<pw[i][j]<<endl;
            }
        }
    }

    dfs(-1,0);

    //cout<<ans<<endl;
    ////////////////////

    /*long long sum=0;
    for(long long i=0;i<a.size();i++)
        sum+=a[i]*p[i];

        //cout<<sum/x<<endl;
	long long ans1=1;
	for(long long g=1;g<=sum/x;g++)
    {
        for(long long i=0;i<a.size();i++)
            h[i]=a[i];
        long long maxx=0,num=0;
        while(num<x)
        {
            long long curr=g;
            for(long long i=a.size()-1;i>=0;i--)
            {
                long long need=min(h[i],curr/p[i]);
                h[i]-=need;
                curr-=need*p[i];
            }
            if(curr!=0)break;
            num++;
        }
        if(num==x)ans1++;
    }
	if(ans1!=ans)
    {
        cout<<x<<endl;
        for(int i=0;i<a.size();i++)
            cout<<a[i]<<" ";
        cout<<endl;
        exit(0);
    }*/

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...