This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<cassert>
#include<unordered_map>
#include <queue>
#include <cstdint>
#include<cstring>
#include<limits.h>
#include<cmath>
#include<set>
#include<algorithm>
#include <iomanip>
#include<numeric>
#include<bitset>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define int long long
using namespace std;
const int mod=1e9+7,mxn=1e5+5,inf=1e9,minf=-1e18,lg=30,valbound=1e9;
//#undef int
int k,m,q,p,h,w,n;
void setIO(string name){
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
int val[mxn+10];
map<int,int>on;
void simplify(){
bool yes=1;
int cnt=0;
while(yes){
cnt++;
vector<int>del;
for(auto &i:on){
if(i.s==0)continue;
if(i.s>1&&i.f>2){
if(i.s/2){
on[i.f+1]+=(i.s)/2;
on[i.f-2]+=(i.s)/2;
}
i.s%=2;
if(i.s==0)del.pb(i.f);
}
else if(i.s>1&&i.f==2){
if(i.s/2){
on[i.f+1]+=(i.s)/2;
on[i.f-1]+=(i.s)/2;
}
i.s%=2;
if(i.s==0)del.pb(i.f);
}
}
for(auto &i:on){
if(i.s==0)continue;
if(i.f==1){
if(i.s/2)on[2]+=(i.s/2);
i.s%=2;
if(i.s==0)del.pb(i.f);
}
else{
int x=min(on[i.f-1],i.s);
if(x){
on[i.f+1]+=x;
i.s-=x;
on[i.f-1]-=x;
}
if(on[i.f-1]==0)del.pb(i.f-1);
if(i.s==0)del.pb(i.f);
}
}
sort(all(del));
del.erase(unique(all(del)),del.end());
for(auto i:del)on.erase(i);
bool nxt=0;
for(auto i:on)if(i.s>1)nxt=1;
yes=nxt;
}
}
int dp[2];
int cal(int a,int b){return ((b-a-1)/2);}
int get(){
int last=-1;
dp[0]=0,dp[1]=0;
for(auto i:on){
if(last==-1){
dp[0]=1;
dp[1]=cal(0,i.f);
}
else{
int x=(dp[0]+dp[1])%mod,y=0;
y=(dp[0]*cal(last,i.f))%mod;
y=(y+(dp[1]*cal(last-1,i.f))%mod)%mod;
dp[0]=x,dp[1]=y;
}
last=i.f;
}
return (dp[0]+dp[1])%mod;
}
int32_t main(){
fastio
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>val[i];
for(int i=1;i<=n;i++){
on[val[i]]++;
simplify();
cout<<get()<<'\n';
}
}
/*
for a number x with occurences y
we can make the number x+z using fib(z+1) xs
we can push the number and get a set of number with only 1 occurence
what to do with these distinct number?
for a number x
we can split it into x-1,x-2
if we keep spliting to x-1,x-3,x-4
x-1,x-3,x-5,x-6
we can see the odd number wont be able to split as it will result in having the same number
so there has to be an even number y that is the end
we can do dp[i][split?]
dp[i][not split]=(sum of dp[i-1])
dp[i][split]={
dp[i-1][not split]*(number of usable y in range (val[i-1],val[i]))
+
dp[i-1][split]*(number of usable y in range (val[i-1]-1,val[i]))
}
would this work?
*/
Compilation message (stderr)
fib.cpp:32:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
32 | #pragma GCC optimize ("03,unroll-lopps")
| ^
fib.cpp:38:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
38 | void setIO(string name){
| ^
fib.cpp:45:15: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
45 | void simplify(){
| ^
fib.cpp:97:20: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
97 | int cal(int a,int b){return ((b-a-1)/2);}
| ^
fib.cpp:98:9: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
98 | int get(){
| ^
fib.cpp:116:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
116 | int32_t main(){
| ^
fib.cpp: In function 'void setIO(std::string)':
fib.cpp:40:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
40 | freopen((name+".in").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fib.cpp:41:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
41 | freopen((name+".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |