NC204555. 区间加
描述
输入描述
第一行两个整数表示序列的长度以及任意的目标值。
接下来个整数,为牛妹的初始序列。
输出描述
一个整数表示方案数,答案对取模。
示例1
输入:
3 2 1 1 1
输出:
4
说明:
C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-04-08 00:25:29
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244355; ll a[2005],b[2005]; int main(){ ios::sync_with_stdio(0); int n,m;cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i],a[i]=m-a[i],b[i]=a[i]-a[i-1]; ll ans=1,now=0; for(int i=1;i<=n;i++){ if(abs(b[i]>1)) return cout<<0,0; if(b[i]==1) ++now; if(b[i]==-1) (ans*=now)%=mod,now--; if(b[i]==0) (ans*=(now+1))%=mod; } cout<<ans<<endl; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2020-04-04 20:17:20
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=998244355; ll n,m,tmp,ans=1,a[2005],b[2005]; int main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ scanf("%lld",a+i); b[i]=m-a[i]; } for(int i=1;i<=n;i++){ if(abs(b[i]-b[i-1])>1){printf("0\n");return 0;} if(b[i]-b[i-1]==1) tmp++; else if(b[i]-b[i-1]==-1) ans=ans*tmp%mod,tmp--; else ans=ans*(tmp+1)%mod; } printf("%lld",ans); }