Submission #826304

#TimeUsernameProblemLanguageResultExecution timeMemory
826304gagik_2007Fibonacci representations (CEOI18_fib)C++17
40 / 100
4070 ms1080 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define ff first
#define ss second

ll ttt;
const ll INF=1e18;
const ll MOD=1e9+7;
const ll N=100007;
ll n,m,k;
int a[N];
vector<__int128_t>fi;
ll dp[N][2];

void calc_fi(int len){
    fi.push_back(1);
    fi.push_back(2);
    for(int i=2;i<=len;i++){
        fi.push_back(fi[i-1]+fi[i-2]);
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
    cin>>n;
    calc_fi(150);
    __int128_t sum=0;
    bool st3=false;
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]>100)st3=true;
    }
    if(st3){
        vector<int>p;
        for(int i=0;i<n;i++){
            p.push_back(a[i]);
            sort(p.begin(),p.end());
            // for(int x:p)cout<<x<<" ";
            // cout<<endl;
            int lst=0;
            dp[0][0]=1;
            dp[0][1]=0;
            for(int i=0;i<p.size();i++){
                dp[i+1][0]=dp[i][0]+dp[i][1];
                int diff=p[i]-lst;
                if(diff>=2){
                    if(diff%2==0){
                        diff/=2;
                        dp[i+1][1]=(dp[i][0]+dp[i][1])*(diff-1)+dp[i][1];
                    }
                    else{
                        diff/=2;
                        dp[i+1][1]=(dp[i][0]+dp[i][1])*diff;
                    }
                }
                else{
                    dp[i+1][1]=0;
                }
                dp[i+1][0]%=MOD;
                dp[i+1][1]%=MOD;
                lst=p[i];
                // cout<<dp[i+1][0]<<" "<<dp[i+1][1]<<endl;
            }
            cout<<(dp[p.size()][0]+dp[p.size()][1])%MOD<<endl;
        }
        return 0;
    }
    for(int i=0;i<n;i++){
        sum+=fi[a[i]-1];
        vector<int>p;
        __int128_t tmp=sum;
        while(tmp!=0){
            auto it=upper_bound(fi.begin(),fi.end(),tmp);
            it--;
            p.push_back(it-fi.begin()+1);
            tmp-=*it;
        }
        reverse(p.begin(),p.end());
        // for(int x:p)cout<<x<<" ";
        // cout<<endl;
        int lst=0;
        dp[0][0]=1;
        dp[0][1]=0;
        for(int i=0;i<p.size();i++){
            dp[i+1][0]=dp[i][0]+dp[i][1];
            int diff=p[i]-lst;
            if(diff>=2){
                if(diff%2==0){
                    diff/=2;
                    dp[i+1][1]=(dp[i][0]+dp[i][1])*(diff-1)+dp[i][1];
                }
                else{
                    diff/=2;
                    dp[i+1][1]=(dp[i][0]+dp[i][1])*diff;
                }
            }
            else{
                dp[i+1][1]=0;
            }
            dp[i+1][0]%=MOD;
            dp[i+1][1]%=MOD;
            lst=p[i];
            // cout<<dp[i+1][0]<<" "<<dp[i+1][1]<<endl;
        }
        cout<<(dp[p.size()][0]+dp[p.size()][1])%MOD<<endl;
    }
}

Compilation message (stderr)

fib.cpp: In function 'int main()':
fib.cpp:53:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |             for(int i=0;i<p.size();i++){
      |                         ~^~~~~~~~~
fib.cpp:94:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |         for(int i=0;i<p.size();i++){
      |                     ~^~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...